我有一个numpy数组的列表-例如:
[array([ 0. , -11.35190205, 11.35190205, 0. ]),
array([ 0. , 36.58012599, -36.58012599, 0. ]),
array([ 0. , -41.94408202, 41.94408202, 0. ])]
在上面的numpy数组列表中,我有一个列表列表,这些列表是每个numpy数组的索引:
[['A_A', 'A_B', 'B_A', 'B_B'],
['A_A', 'A_D', 'D_A', 'D_D'],
['B_B', 'B_C', 'C_B', 'C_C']]
我想从这些对象中创建一个pandas dataframe
,但我不确定如果不先为LIST_A中的每个numpy arrays
和其LIST_B中的相关索引创建系列对象,该如何做呢?即LIST_A[0]
的索引是LIST_B[0]
等),然后执行pd.concat(s1,s2,s3...)
获得所需的数据帧。
在上述情况下,我可以按以下方式构造所需的数据框:
s1 = pd.Series(list_a[0], index=list_b[0])
s2 = pd.Series(list_a[1], index=list_b[1])
s3 = pd.Series(list_a[2], index=list_b[2])
df = pd.concat([s1,s2,s3], axis=1)
0 1 2
A_A 0.000000 0.000000 NaN
A_B -11.351902 NaN NaN
A_D NaN 36.580126 NaN
B_A 11.351902 NaN NaN
B_B 0.000000 NaN 0.000000
B_C NaN NaN -41.944082
C_B NaN NaN 41.944082
C_C NaN NaN 0.000000
D_A NaN -36.580126 NaN
D_D NaN 0.000000 NaN
在我的实际应用中,上述列表的大小为数百个,因此我不想创建数百个系列对象,然后将它们全部串联起来(除非这是唯一的方法?)。
我已经阅读了有关Adding list with different length as a new column to a dataframe和convert pandas series AND dataframe objects to a numpy array之类的各种文章,但未能找到一种优雅的解决方案来解决需要在其中创建数百个系列对象的问题为了产生所需的数据帧。
答案 0 :(得分:1)
与您的方法没有太大不同,但这应该会更快:
df = pd.DataFrame(dict(zip(list_b[i], list_a[i])) for i in range(len(list_a))).T
输出:
0 1 2
A_A 0.000000 0.000000 NaN
A_B -11.351902 NaN NaN
A_D NaN 36.580126 NaN
B_A 11.351902 NaN NaN
B_B 0.000000 NaN 0.000000
B_C NaN NaN -41.944082
C_B NaN NaN 41.944082
C_C NaN NaN 0.000000
D_A NaN -36.580126 NaN
D_D NaN 0.000000 NaN