Pandas数据框:按两列分组,然后对另一列取平均值

14
假设我有一个包含以下数值的数据框:
df:
col1    col2    value
1       2       3
1       2       1
2       3       1

我希望能够首先按照数据框的前两列(col1和col2)进行分组,然后对第三列(value)的值求平均。因此,期望的输出结果将如下所示:

col1    col2    avg-value
1       2       2
2       3       1

我正在使用以下代码:

columns = ['col1','col2','avg']
df = pd.DataFrame(columns=columns)
df.loc[0] = [1,2,3]
df.loc[1] = [1,3,3]
print(df[['col1','col2','avg']].groupby('col1','col2').mean())

出现以下错误:

ValueError: No axis named col2 for object type <class 'pandas.core.frame.DataFrame'>

任何帮助将不胜感激。

2个回答

16
你需要传递一个列的列表来进行分组,你传递的被解释为axis参数,这就是为什么会引发错误的原因:
In [30]:
columns = ['col1','col2','avg']
df = pd.DataFrame(columns=columns)
df.loc[0] = [1,2,3]
df.loc[1] = [1,3,3]

print(df[['col1','col2','avg']].groupby(['col1','col2']).mean())
           avg
col1 col2     
1    2       3
     3       3

7

如果您想按多个列进行分组,应将它们放入列表中:

columns = ['col1','col2','value']
df = pd.DataFrame(columns=columns)
df.loc[0] = [1,2,3]
df.loc[1] = [1,3,3]
df.loc[2] = [2,3,1]
print(df.groupby(['col1','col2']).mean())

稍微详细一些,为了让你的聚合数据框中出现“avg”这个词:

import numpy as np
columns = ['col1','col2','value']
df = pd.DataFrame(columns=columns)
df.loc[0] = [1,2,3]
df.loc[1] = [1,3,3]
df.loc[2] = [2,3,1]
print(df.groupby(['col1','col2']).agg({'value': {'avg': np.mean}}))

这与我的答案有何不同? - EdChum
不用担心,但最好不要发布重复的答案,除非有真正的区别。 - EdChum

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