我有一个pandas
数据框,其中有一列,其中的数据是从groupby操作计算出的统计信息列表。
df = pd.DataFrame({'a':[1,1,1,2,2,2,3], 'b':[3,4,2,3,4,3,2]})
def calculate_stuff(x):
return len(x)/5, sum(x)/len(x), sum(x)
>>> df.groupby('a').apply(lambda row : calculate_stuff(row.b))
a
1 (0, 3, 9)
2 (0, 3, 10)
3 (0, 2, 2)
dtype: object
基本上,我有几个相互依赖的统计数据,必须为每个groupby行计算。执行此操作的函数返回统计值的元组。我想要的是为元组的每个索引创建一个新列,使它看起来像这样:
a col1 col2 col3
1 0 3 9
2 0 3 10
3 0 2 2
我认为我不能使用df.groupby('a').agg
,因为其他计算需要进行其中一项计算。有什么建议吗?
编辑:我意识到我的例子中的聚合函数不是聚合函数,所以我改了它们
答案 0 :(得分:2)
添加额外的a
类别项目,结果为4x3。
df = pd.DataFrame({'a': [1, 1, 1, 2, 2, 2, 3, 4],
'b': [3, 4, 2, 3, 4, 3, 2, 1]})
new_cols = ['col1', 'col2', 'col3']
gb = df.groupby('a').apply(lambda group: calculate_stuff(group.b))
>>> pd.DataFrame(zip(*gb), columns=gb.index, index=new_cols).T
col1 col2 col3
a
1 0 3 9
2 0 3 10
3 0 2 2
4 0 1 1
答案 1 :(得分:1)
您可以尝试list
理解:
import pandas as pd
df = pd.DataFrame({'a':[1,1,1,2,2,2,3], 'b':[3,4,2,3,4,3,2]})
def calculate_stuff(x):
return len(x)/5, sum(x)/len(x), sum(x)
group_df = df.groupby('a').apply(lambda row : calculate_stuff(row.b))
print pd.DataFrame([x for x in group_df],
columns=['col1','col2','col3'],
index=group_df.index)
col1 col2 col3
a
1 0 3 9
2 0 3 10
3 0 2 2