Pandas 数据框:按两列分组,然后对另一列进行平均
Posted
技术标签:
【中文标题】Pandas 数据框:按两列分组,然后对另一列进行平均【英文标题】:Pandas dataframe: Group by two columns and then average over another column 【发布时间】:2016-06-05 21:00:49 【问题描述】:假设我有一个具有以下值的数据框:
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'>
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:如果你想按多列分组,你应该把它们放在一个列表中:
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())
或者稍微冗长一些,以便在聚合数据框中获取“平均”一词:
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))
【讨论】:
这与我的回答有何不同? 不用担心,但最好不要发布重复的答案,除非有真正的区别【参考方案2】:您需要将列列表传递给 groupby,您传递的内容被解释为 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
【讨论】:
以上是关于Pandas 数据框:按两列分组,然后对另一列进行平均的主要内容,如果未能解决你的问题,请参考以下文章