【问题标题】:Pandas Groupby: return dict of rowsPandas Groupby:返回行的字典
【发布时间】:2020-02-05 04:46:25
【问题描述】:

我想按其中一列对我的数据框进行分组,然后返回一个字典,其中包含每列值的所有行的列表。有没有一个快速的 Pandas 习语可以做到这一点?

例子:

test = pd.DataFrame({
    'id': ['alice', 'bob', 'bob', 'charlie'],
    'transaction_date': ['2020-01-01', '2020-01-01', '2020-01-02', '2020-01-02'],
    'amount': [50.0, 10.0, 12.0, 13.0]
})

期望的输出:

result = {
  'alice': [Series(transaction_date='2020-01-01', amount=50.0)],
  'bob': [Series(transaction_date='2020-01-01', amount=10.0), Series(transaction_date='2020-01-02', amount=12.0)],
  'charlie': [Series(transaction_date='2020-01-02', amount=53.0)],
}

以下方法有效:

test.groupby('id').agg(list)
  • 返回一个 Dataframe,其中每一列(amount 和 transaction_date)都有一个值列表,但这不是我想要的。我希望结果是每个唯一分组列值(“id”值)的行/熊猫系列列表。
test.groupby('id').agg(list).to_dict():
{'amount': {'charlie': [13.0], 'bob': [10.0, 12.0], 'alice': [50.0]}, 'transaction_date': {'charlie': ['2020-01-02'], 'bob': ['2020-01-01', '2020-01-02'], 'alice': ['2020-01-01']}}
test.groupby('id').apply(list).to_dict():
{'charlie': ['amount', 'id', 'transaction_date'], 'bob': ['amount', 'id', 'transaction_date'], 'alice': ['amount', 'id', 'transaction_date']}

【问题讨论】:

  • 这似乎是一种奇怪的特殊和不常见的格式,你为什么要这个?
  • 这是我想解决这个问题的另一种方式:stackoverflow.com/questions/60071112/…。我可以制作上面的查找字典,然后将一个函数应用到另一个数据帧的每一行,该数据帧使用二分搜索快速找到满足一组 transaction_date 条件的匹配事务。

标签: pandas dataframe pandas-groupby


【解决方案1】:

使用itertupleszip

import pandas as pd

test = pd.DataFrame({
    'id': ['alice', 'bob', 'bob', 'charlie'],
    'transaction_date': ['2020-01-01', '2020-01-01', '2020-01-02', '2020-01-02'],
    'amount': [50.0, 10.0, 12.0, 13.0]
})

columns = ['transaction_date', 'amount']

grouped = (test
           .groupby('id')[columns]
           .apply(lambda x: list(x.itertuples(name='Series', index=False))))


print(dict(zip(grouped.index, grouped.values)))

{
    'alice': [Series(transaction_date='2020-01-01', amount=50.0)], 
    'bob': [
        Series(transaction_date='2020-01-01', amount=10.0), 
        Series(transaction_date='2020-01-02', amount=12.0)
    ], 
    'charlie': [Series(transaction_date='2020-01-02', amount=13.0)]
}

【讨论】:

    猜你喜欢
    • 2021-07-19
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2020-01-17
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多