【问题标题】:Pandas: Create dict where one column is key and list of remaining columns are valuesPandas:创建字典,其中一列是键,其余列的列表是值
【发布时间】: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]}

【问题讨论】:

    标签: python python-3.x pandas dataframe dictionary


    【解决方案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_dictorient='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 正在寻找最快的解决方案?
    猜你喜欢
    • 1970-01-01
    • 2019-09-25
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2020-07-29
    • 1970-01-01
    • 2018-07-27
    相关资源
    最近更新 更多