Pandas:返回多列的平均值

13

如何输出多个列的平均值?

Gender   Age     Salary     Yr_exp   cup_coffee_daily
  Male    28    45000.0        6.0                2.0
Female    40    70000.0       15.0               10.0
Female    23    40000.0        1.0                0.0
  Male    35    55000.0       12.0                6.0

我有df.groupby('Gender', as_index=False)['Age', 'Salary', 'Yr_exp'].mean(),但它仅返回第一列Age的平均值。如何返回不同列中特定列的平均值?期望输出:

Gender   Age     Salary   Yr_exp
  Male  31.5    50000.0      9.0
Female  31.5    55000.0      8.0

谢谢。


4
可以输入df.applymap(type),我认为'Salary'和'Yr_exp'因某些原因是字符串。 - BENY
哦,是的,你说得对。有些值不是数字确实很奇怪。谢谢! - Karma
2个回答

20

给定这个数据框:

df = pd.DataFrame({
    "Gender": ["Male", "Female", "Female", "Male"],
    "Age": [28, 40, 23, 35],
    "Salary": [45000, 70000, 40000, 55000],
    "Yr_exp": [6, 15, 1, 12]
})

df
   Age  Gender  Salary  Yr_exp
0   28    Male   45000       6
1   40  Female   70000      15
2   23  Female   40000       1
3   35    Male   55000      12

按性别分组并使用mean()函数:

df.groupby("Gender").mean()
         Age   Salary  Yr_exp
Gender                       
Female  31.5  55000.0     8.0
Male    31.5  50000.0     9.0

注意:在使用groupby()之后,您可能需要更改索引方式:df['Age','Salary']会导致KeyError,但是df[['Age','Salary']]会返回预期的结果:

   Age  Salary
0   28   45000
1   40   70000
2   23   40000
3   35   55000
尝试更改
df.groupby("Gender", as_index=True)['Age', 'Salary', 'Yr_exp'].mean() 
df.groupby("Gender", as_index=True)[['Age', 'Salary', 'Yr_exp']].mean()

添加 reset_index 以便我们将分组作为数据框获取是最后一步。 - Sandeep
2
df.groupby('Gender', as_index=False)['Age', 'Salary', 'Yr_exp'].mean() 的作用是什么?我认为操作者知道如何使用 groupby 进行平均值计算,这不是问题的关键。 - BENY
感谢Jonathan的回答,df.groupby("Gender", as_index=True)[['Age', 'Salary', 'Yr_exp']].mean()正是我尝试过的(我使用了index=False),但它只返回了第一列,也就是Age。如果我只使用.mean()而不指定哪些列,它会给我所有的列,但有其他的列我并不需要。最好的情况是,如果可能的话,我定义自己要输出的列。(抱歉,我应该在我的问题中提到它,现在我会编辑它) - Karma
@Karma - 你使用的Python和Pandas版本是什么? - Jonathan Dayton
1
@JonathanDayton 我找到原因了。似乎有些列不是数字类型,所以我得到了这个DataError错误,没有可聚合的数字类型。抱歉,你是对的。 - Karma
显示剩余3条评论

9
您还可以使用 pandas.agg()
df.groupby("Gender").agg({'Age' : 'mean', 'Salary' : 'mean', 'Yr_exp': 'mean'})

会导致结果:
         Age    Salary  Yr_exp
Gender          
Female  31.5    55000   8
Male    31.5    50000   9

使用.agg()可以让您对分组对象应用不同的函数,类似于:
df.groupby("Gender").agg({'Age' : 'mean', 'Salary' : ['min', 'max'], 'Yr_exp': 'sum'})

输出:

          Age         Salary    Yr_exp
         mean    min      max   sum
Gender              
Female  31.5    40000   70000   16
Male    31.5    45000   55000   18

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