将具有相同索引的熊猫系列列表转换为字典

时间:2019-05-09 03:57:33

标签: pandas list series

我有一个熊猫系列的列表,每个都有相同的索引。我想将此列表转换成字典,其中的键是索引值(在所有Seri​​es中都相同,而value是Series对象中的值列表)。这是一个示例:

series_1:
A 1
B 2
C 3

series_2:
A 11
B 22
C 33

[series_1, series_2]转换为{'A': [1,11], 'B': [2,22], 'C': [3,33]}的最有效的方法(最好是无循环)是什么?我需要一种有效的方法,因为我拥有的序列数是10K,每个具有20K元素。

2 个答案:

答案 0 :(得分:1)

最好的性能是转换为numpy数组的字典,而不是列表的字典,并使用该系列的LEFT JOIN来构造字典。

此外,如果您确实需要列表字典,则在np.arraydict上使用zips.index仍然比上面的两种方法好得多。以上2种方法都有创建数据帧的开销。

设置一系列2万个数字

np.array.tolist()

在1000个系列上创建s = pd.Series(np.arange(20000)) 的字典

np.array

在1000个系列上创建dict(zip(s.index, np.column_stack([s.values]*1000))) 的字典

list

对所有4种方法进行计时:

dict(zip(s.index, np.column_stack([s.values]*1000).tolist()))

In [1071]: %timeit dict(zip(s.index, np.column_stack([s.values]*1000))) 195 ms ± 879 µs per loop (mean ± std. dev. of 7 runs, 1 loop each) In [1072]: %timeit dict(zip(s.index, np.column_stack([s.values]*1000).tolist())) 1.05 s ± 4.26 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) In [1075]: %timeit pd.concat([s]*1000).groupby(level=0).apply(list).to_dict() 7.01 s ± 70.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) In [1077]: %timeit pd.concat([s]*1000, axis=1).T.to_dict('l') 2.83 s ± 11.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) numpy一起使用dict系列的数组要快于两种使用zip的方法。 pd.concat的字典在np.array处最快,是下一个字典的5倍。

答案 1 :(得分:0)

这里是concat然后groupby的一种方法

pd.concat([s1,s2]).groupby(level=0).apply(list).to_dict()
Out[375]: {'A': [1, 11], 'B': [2, 22], 'C': [3, 33]}

更新

pd.concat([s1,s2],axis=1).T.to_dict('l')
Out[379]: {'A': [1, 11], 'B': [2, 22], 'C': [3, 33]}