Pandas数据框按列分组并生成列表或数组

5
import pandas as pd
import numpy as np

df = {'a': ['aa', 'aa', 'aa', 'aaa', 'aaa'], 
      'b':['bb', 'bb', 'bb', 'bbb', 'bbb'], 
      'c':[10,20,30,100,200]}

df = pd.DataFrame(data=df)

my_dict=df.groupby(['a', 'b'])['c'].apply(np.hstack).to_dict()

给出以下字典
>>> my_dict
{('aa', 'bb'): array([10, 20, 30]), ('aaa', 'bbb'): array([100, 200])}

除了使用apply,还有更快/更有效的方法吗?

2个回答

5
使用字典推导式:
my_dict= {k:np.hstack(v) for k, v in df.groupby(['a', 'b'])['c']}
print (my_dict)
{('aa', 'bb'): array([10, 20, 30]), ('aaa', 'bbb'): array([100, 200])}

2
你可以使用 groupbyitertuples
my_dict = dict(df.groupby(['a','b']).agg(list).itertuples(name=None))

{('aa', 'bb'): [10, 20, 30], ('aaa', 'bbb'): [100, 200]}

更简洁地说,正如Ch3steR所指出的那样:
df.groupby(['a','b']).agg(list).to_dict() 


{('aa', 'bb'): [10, 20, 30], ('aaa', 'bbb'): [100, 200]}

1
df.groupby(['a','b']).agg(list).to_dict() -> {('aa', 'bb'): [10, 20, 30], ('aaa', 'bbb'): [100, 200]} - Ch3steR
@Ch3steR非常干净,谢谢,已添加为答案。我猜当使用.to_dict方法时,索引会作为元组返回。 - Umar.H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接