熊猫Groupby:返回行的字典

时间:2020-02-05 04:46:25

标签: pandas dataframe pandas-groupby

我想将我的数据框按列之一分组,然后返回一个字典,该字典包含每个列值的所有行的列表。这样做有快速的熊猫习语吗?

示例:

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)
  • 返回一个数据框,其中每个列(金额和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']}

1 个答案:

答案 0 :(得分: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)]
}