In [6]: df = pd.DataFrame(randint(0,10,10000).reshape(5000,2),columns=list('AB'))
In [7]: %timeit dict(zip(df.A,df.B))
1000 loops, best of 3: 1.27 ms per loop
In [8]: %timeit pd.Series(df.A.values,index=df.B).to_dict()
1000 loops, best of 3: 987 us per loop
100 loops, best of 3: 7.04 ms per loop # WouterOvermeire
100 loops, best of 3: 9.83 ms per loop # Jeff
100 loops, best of 3: 4.28 ms per loop # Kikohs (me)
8条答案
按热度按时间kpbwa7wx1#
速度比较(使用Wouter方法)
djp7away2#
我找到了一种更快的方法来解决这个问题,至少在实际的大型数据集上使用:
df.set_index(KEY).to_dict()[VALUE]
5万行的证明:
输出:
o3imoua43#
这将为您提供:
bogh5gae4#
在Python 3.6中,最快的方法仍然是WouterOvermeire的方法。Kikohs的建议比其他两种方法慢。
结果:
tzdcorbm5#
TL;DR
长
解释解决方案:
dict(sorted(df.values.tolist()))
给定:
[out]:
试试看:
[out]:
然后任选地:
或者:
[out]:
最后,将2个元素的列表转换为一个dict。
[out]:
相关
回复@sbradbio评论:
如果一个特定的键有多个值,而你想保留所有的值,这不是最有效但最直观的方法:
[out]:
suzh9iv86#
下面是使用以下df测试的另外两种方法。
使用
to_records()
使用
MultiIndex.from_frame()
每个人的时间。
fxnxkyjh7#
我喜欢Wouter方法,但是重复值的行为可能不是预期的,不幸的是,OP没有讨论这种情况。Wouter总是为遇到的每个键选择最后一个值。换句话说,它会不断覆盖每个键的值。
在我看来,预期的行为更像是Create a dict using two columns from dataframe with duplicates in one column,其中为每个键保留一个列表。
因此,对于保持重复的情况,让我提交
df.groupby('Position')['Letter'].apply(list).to_dict()
(或者甚至是一个集合而不是列表)qxsslcnc8#
还有一个简单的方法将dataframe列转换为dictionary
Dataframe :
使用词典理解
您将获得: