我有一个熊猫系列的列表,每个都有相同的索引。我想将此列表转换成字典,其中的键是索引值(在所有Series中都相同,而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元素。
答案 0 :(得分:1)
最好的性能是转换为numpy数组的字典,而不是列表的字典,并使用该系列的LEFT JOIN
来构造字典。
此外,如果您确实需要列表字典,则在np.array
和dict
上使用zip
和s.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]}