在Python中转置和乘法列表

3

我有一个二维列表/矩阵,它具有动态的 N 行和 M 列。

Sample Matrix

每个列中的数据类型是一致的,例如:col1 是文本,col2 是整数,column3 是浮点数等。

列的顺序可能不同。某些行的值也可能缺失。

期望的结果应该是 2 个列表/数组/数据框,其中:

  • list1 应该被复制 N 次(取决于行数)col1_r1、col1_r2、......、colM_row_n,并附加迭代器或行数
  • list2 应该是行的转置值(包括空值)

使用本机列表和/或 numpy 数组或/和 panda 数据框,在 Python 3.6 中实现此目标的最佳方法是什么?

output_list1 = [col1_1, col1_2, col1_3, col1_4, col1_5, col2_1, col2_2, 
                col2_3, col2_4, col2_5, col3_1, col3_2, col3_3, col3_4, col3_5]

-

output_list2 = ["value-row1,col1", "", "value-row3,col1",   "value-row4,col1",  
                ",value-row5,col1", "value-row1,col2", "value-row2,col2",   "value-row3,col3",  
                0,  "value-row5, col5", "value-row1, col3", 0.0, 0.0, 0.0, "value-row5,col4"]

提前感谢您的帮助。


1
矩阵是如何存储的?它是一些列表的列表还是其他什么东西? - maQ
这是一个列表的列表。 - Nakinov
列的列表还是行的列表? - maQ
这是一个列的列表。我正在解析一个包含许多表格的HTML文件。我能够创建特定列表的numpy数组,因此在row0,colM处,我有需要复制的列表标题,而在row1+dim(array)处,我有需要转置的其余数据。 #从我的“文件”列表中获取第6个列表 a = np.array(file[0][6]) #获取形状 print(a.shape) #(11,6) - Nakinov
1个回答

4
这个应该有用:
import numpy as np

# create the data in a nested list
data_list = [['Event', 'Waits', 'Total Wait Time (sec)', 'Wait Avg(ms)', '% DB time', 'Wait Class'], 
             ['latch free', '15,625', '311', '19.91', '29.6', 'Other'], 
             ['library cache: mutex X', '90,012', '117,8', '1.31', '11.2', 'Concurrency'], 
             ['DB CPU', '\xa0', '87,3', '\xa0', '8.3', '\xa0']]

# transform into numpy object array
data_array = np.array(data_list, dtype=object)
# construct header from first row
header = data_array[0, :]
# only use the data part of the array
data = data_array[1:, :]

list1 = []
list2 = []
for i in range(data.shape[0]):
    for j in range(data.shape[1]):
        # adjust for the 1 based index of row numbers
        # transpose header columns by switching indices i and j
        list1.append('{}_{}'.format(header[j], i+1))
        # populate flattened data list
        list2.append(data[i,j])

print(list1)
print(list2)

输出:

list1 = ['Event_1', 'Waits_1', 'Total Wait Time (sec)_1', 'Wait Avg(ms)_1', '% DB time_1', 'Wait Class_1', 'Event_2', 'Waits_2', 'Total Wait Time (sec)_2', 'Wait Avg(ms)_2', '% DB time_2', 'Wait Class_2', 'Event_3', 'Waits_3', 'Total Wait Time (sec)_3', 'Wait Avg(ms)_3', '% DB time_3', 'Wait Class_3']
list2 = ['latch free', '15,625', '311', '19.91', '29.6', 'Other', 'library cache: mutex X', '90,012', '117,8', '1.31', '11.2', 'Concurrency', 'DB CPU', '\xa0', '87,3', '\xa0', '8.3', '\xa0']

感谢您的帮助WofgangK。这非常接近我要找的东西。也许我没有描述清楚。data_array = [['事件', '等待次数', '总等待时间(秒)', '平均等待时间(毫秒)', '% DB时间', '等待类别'], ['闩锁空闲', '15,625', '311', '19.91', '29.6', '其他'], ['库缓存:互斥X', '90,012', '117,8', '1.31', '11.2', '并发性'], ['DB CPU', '\xa0', '87,3', '\xa0', '8.3', '\xa0']]data_array [0]是需要重复N次的列表的标题,本例中为3次。hdr名称需要与列表值相同,只需附加迭代值即可。 - Nakinov
只是为了澄清一下:你想要的是让list1看起来像list1 = ['Event_1', 'Event_2', 'Event_3', 'Waits_1', ..., 'Wait Class_3']吗?list2是否与你所期望的类似? - WolfgangK
转置应该不是一次性对整个数据集进行,而是逐列进行。例如:list1 = '事件_1'、'等待_1'、'总等待时间(秒)_1'、'等待平均值(ms)_1'、'% DB 时间_1'、'等待类别_1'、'事件_2'、'等待次数_2'、'总等待时间(秒)_2'、'等待平均值(ms)_2'、'% DB 时间_2'、'等待类别_2' 等。list2 = '无竞争锁', '15,625', '311', '19.91', '29.6', '其他', '库缓存:互斥 x', '90,012', '117.8', '1.31', '11.2', '并发' 等。 - Nakinov
根据新信息进行更新。使用双重for循环以提高清晰度。如果您有大量数据,应使用numpy来消除这些数据以提高速度。 - WolfgangK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接