Pandas:创建字典,其中一列是键,其余列的列表是值
Posted
技术标签:
【中文标题】Pandas:创建字典,其中一列是键,其余列的列表是值【英文标题】:Pandas: Create dict where one column is key and list of remaining columns are values 【发布时间】:2021-05-14 21:25:06 【问题描述】:下面是df
:
In [1114]: df
Out[1114]:
site_id a b c d e
0 1 4 2 5 50 150
1 2 56 3 6 60 160
2 3 7 4 7 70 170
3 4 8 5 8 80 180
我想创建一个dict
,其中site_id
列是键,其他列的列表是值。
我的尝试:
In [1101]: y = df.site_id.values
In [1109]: x = df[df.columns.difference(['site_id'])].values
In [1112]: d = i:x[c] for c,i in enumerate(y)
In [1113]: d
Out[1113]:
1: array([ 4, 2, 5, 50, 150]),
2: array([ 56, 3, 6, 60, 160]),
3: array([ 7, 4, 7, 70, 170]),
4: array([ 8, 5, 8, 80, 180])
我能够解决它,但正在寻找更多pandaic
的方式。
预期输出:
1: [4, 2, 5, 50, 150],
2: [56, 3, 6, 60, 160],
3: [7, 4, 7, 70, 170],
4: [8, 5, 8, 80, 180]
【问题讨论】:
【参考方案1】:将 agg 应用于 df 应该将所有列值发送到列表。将 site_id 设置为索引,然后可以将结果输入键:值对
df.set_index('site_id').agg(list,1).to_dict()
1: [4, 2, 5, 50, 150],
2: [56, 3, 6, 60, 160],
3: [7, 4, 7, 70, 170],
4: [8, 5, 8, 80, 180]
【讨论】:
接受这个答案,因为它在大约 2M 行的数据集上运行速度很快。 我不能模拟生产 2M 行。 @jezrael 有一个很好的解决方案。转置显然是一个逆,我认为这会占用内存。与 spark 不同的是,Pandas 笔记本不可扩展,这样的操作可能会很慢。【参考方案2】:使用DataFrame.to_dict
和orient='list'
并转置DataFrame
:
d = df.set_index('site_id').T.to_dict(orient='list')
print (d)
1: [4, 2, 5, 50, 150],
2: [56, 3, 6, 60, 160],
3: [7, 4, 7, 70, 170],
4: [8, 5, 8, 80, 180]
【讨论】:
对于大约 2M 行的 Dataframe,哪种解决方案更快?你的还是@wwnde?span> @MayankPorwal - 看起来像 wwnde 答案。 好的,感谢@jezrael 的帮助。已经对你的答案投了赞成票。 @MayankPorwal - 是的,好的 @MayankPorwal - Soo 正在寻找最快的解决方案?以上是关于Pandas:创建字典,其中一列是键,其余列的列表是值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 python 或 pandas 根据包含字典列表的列过滤 DataFrame?
04 pandas DataFrame_创建、文件读取、编码
Pandas:根据另一列的键在现有列上映射字典值以替换 NaN