【问题标题】:Convert a pandas dataframe in a transactional data format to a list - Python将事务数据格式的 pandas 数据帧转换为列表 - Python
【发布时间】:2015-12-04 18:21:51
【问题描述】:

我有一个交易格式的 pandas 数据框:

id  purchased_item
1   apple
1   banana
1   carrot
2   banana
3   apple
4   apple
4   carrot
4   diet coke
5   banana
5   carrot
6   banana
6   carrot

我想将其转换为以下内容:

[['apple', 'banana', 'carrot'],
 ['banana'],
 ['apple'],
 ['apple', 'carrot', 'diet coke'],
 ['banana', 'carrot'],
 ['banana', 'carrot']]

我试过这个:

df.groupby(['id'])['purchased_item'].apply(list)

输出如下:

customer_id
1                 [apple, banana, carrot]
2                                [banana]
3                                 [apple]
4              [apple, carrot, diet coke]
5                        [banana, carrot]
6                        [banana, carrot]

接下来要做什么?还是有不同的方法?非常感谢您的帮助。

【问题讨论】:

标签: python pandas


【解决方案1】:

您在回复question的评论中提到的解决方案:

df.groupby(['id'])['purchased_item'].apply(list).values.tolist()

In [434]: df.groupby(['id'])['purchased_item'].apply(list).values.tolist()
Out[434]:
[['apple', 'banana', 'carrot'],
 ['banana'],
 ['apple'],
 ['apple', 'carrot', 'diet_coke'],
 ['banana', 'carrot'],
 ['banana', 'carrot']]

编辑

与@Colonel Beauvel 解决方案比较的一些测试性能:

In [472]: %timeit [gr['purchased_item'].tolist() for n, gr in df.groupby('id')]
100 loops, best of 3: 2.1 ms per loop

In [473]: %timeit df.groupby(['id'])['purchased_item'].apply(list).values.tolist()
1000 loops, best of 3: 1.36 ms per loop

【讨论】:

    【解决方案2】:

    我宁愿使用理解列表采用不同的解决方案:

    [gr['purchased_item'].tolist() for n, gr in df.groupby('id')]
    
    Out[9]:
    [['apple', 'banana', 'carrot'],
     ['banana'],
     ['apple'],
     ['apple', 'carrot', 'dietcoke'],
     ['banana', 'carrot'],
     ['banana', 'carrot']]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-26
      • 2023-03-04
      • 2018-12-04
      • 2017-02-04
      • 1970-01-01
      • 2020-10-28
      • 2020-02-08
      • 2023-03-25
      相关资源
      最近更新 更多