Pandas数据帧:按两列分组,然后在另一列上取平均值

时间:2016-02-23 20:26:46

标签: python pandas group-by average

假设我有一个包含以下值的数据框:

df:
col1    col2    value
1       2       3
1       2       1
2       3       1

我想首先根据前两列(col1和col2)对我的数据帧进行分组,然后对第二列(值)的值进行平均。所以期望的输出看起来像这样:

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 个答案:

答案 0 :(得分:9)

您需要将列的列表传递给groupby,您传递的内容被解释为axis param,这就是它引发错误的原因:

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

答案 1 :(得分:4)

如果要按多列分组,则应将它们放在列表中:

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}}))