Pandas groupby mean - 进入数据框?

Posted

技术标签:

【中文标题】Pandas groupby mean - 进入数据框?【英文标题】:Pandas groupby mean - into a dataframe? 【发布时间】:2018-04-06 21:45:25 【问题描述】:

假设我的数据如下所示:

date,name,id,dept,sale1,sale2,sale3,total_sale
1/1/17,John,50,Sales,50.0,60.0,70.0,180.0
1/1/17,Mike,21,Engg,43.0,55.0,2.0,100.0
1/1/17,Jane,99,Tech,90.0,80.0,70.0,240.0
1/2/17,John,50,Sales,60.0,70.0,80.0,210.0
1/2/17,Mike,21,Engg,53.0,65.0,12.0,130.0
1/2/17,Jane,99,Tech,100.0,90.0,80.0,270.0
1/3/17,John,50,Sales,40.0,50.0,60.0,150.0
1/3/17,Mike,21,Engg,53.0,55.0,12.0,120.0
1/3/17,Jane,99,Tech,80.0,70.0,60.0,210.0

我想要一个新列 average,这是每个 name,id,dept 元组的 total_sale 的平均值

我试过了

df.groupby(['name', 'id', 'dept'])['total_sale'].mean()

这确实返回了一个具有平均值的系列:

name  id  dept 
Jane  99  Tech     240.000000
John  50  Sales    180.000000
Mike  21  Engg     116.666667
Name: total_sale, dtype: float64

但我将如何引用数据?该系列是形状 (3,) 的一维系列。理想情况下,我希望将其放回具有适当列的数据框中,以便我可以通过name/id/dept 正确引用。

【问题讨论】:

【参考方案1】:

如果您在您拥有的系列上调用.reset_index(),它将为您提供所需的数据框(索引的每一级都将转换为一列):

df.groupby(['name', 'id', 'dept'])['total_sale'].mean().reset_index()

编辑:为了回应 OP 的评论,将此列添加回您的原始数据框有点棘手。您的行数与原始数据框中的行数不同,因此您还不能将其分配为新列。但是,如果您将索引设置为相同,pandas 会很聪明,并且会为您正确填写值。试试这个:

cols = ['date','name','id','dept','sale1','sale2','sale3','total_sale']
data = [
['1/1/17', 'John', 50, 'Sales', 50.0, 60.0, 70.0, 180.0],
['1/1/17', 'Mike', 21, 'Engg', 43.0, 55.0, 2.0, 100.0],
['1/1/17', 'Jane', 99, 'Tech', 90.0, 80.0, 70.0, 240.0],
['1/2/17', 'John', 50, 'Sales', 60.0, 70.0, 80.0, 210.0],
['1/2/17', 'Mike', 21, 'Engg', 53.0, 65.0, 12.0, 130.0],
['1/2/17', 'Jane', 99, 'Tech', 100.0, 90.0, 80.0, 270.0],
['1/3/17', 'John', 50, 'Sales', 40.0, 50.0, 60.0, 150.0],
['1/3/17', 'Mike', 21, 'Engg', 53.0, 55.0, 12.0, 120.0],
['1/3/17', 'Jane', 99, 'Tech', 80.0, 70.0, 60.0, 210.0]
]
df = pd.DataFrame(data, columns=cols)

mean_col = df.groupby(['name', 'id', 'dept'])['total_sale'].mean() # don't reset the index!
df = df.set_index(['name', 'id', 'dept']) # make the same index here
df['mean_col'] = mean_col
df = df.reset_index() # to take the hierarchical index off again

【讨论】:

【参考方案2】:

添加to_frame

df.groupby(['name', 'id', 'dept'])['total_sale'].mean().to_frame()

【讨论】:

这确实为您提供了一个数据框,但我认为他希望将分层​​索引转换回列,除非我误解了。您的方法将创建一个与该系列具有相同索引的数据框。【参考方案3】:

你很亲密。您只需在[['total_sale']] 周围添加一组括号,告诉python 选择作为数据框而不是系列:

df.groupby(['name', 'id', 'dept'])[['total_sale']].mean()

如果你想要所有列:

df.groupby(['name', 'id', 'dept'], as_index=False).mean()[['name', 'id', 'dept', 'total_sale']]

【讨论】:

【参考方案4】:

答案在两行代码中:

第一行创建分层框架。

df_mean = df.groupby(['name', 'id', 'dept'])[['total_sale']].mean()

第二行将其转换为具有四列的数据框('name', 'id', 'dept', 'total_sale')

df_mean = df_mean.reset_index()

【讨论】:

为什么不一个? df_mean = df.groupby(['name', 'id', 'dept'])[['total_sale']].mean().reset_index()

以上是关于Pandas groupby mean - 进入数据框?的主要内容,如果未能解决你的问题,请参考以下文章

数据分析—Pandas 中的分组聚合Groupby 高阶操作

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用mean函数计算每个分组中的所有数值变量的聚合平均值

pandas使用groupby函数基于多个分组变量(多变量分组)对dataframe数据进行分组使用mean函数计算所有分组下数据变量的聚合平均值

pandas使用groupby函数基于多个分组变量(多变量分组)对dataframe数据进行分组使用mean函数计算所有分组下数据变量的聚合平均值

pandas使用groupby函数agg函数获取每个分组聚合对应的均值(mean)实战:计算分组聚合单数据列的均值计算分组聚合多数据列的均值

在groupby之后访问pandas中的分层列