我有一个包含 4 列的 DataFrame (df
):年龄、Request_ID、性别和类型。我的值(value)观如下:
Age Request_ID Gender Type
20 1 M A
28 2 F B
30 1 M C
50 7 M A
19 20 F B
现在我想根据性别和类型获取平均年龄,以及新数据框中每个性别和类型的不同 Request_ID 数量(比例)。
例如,预期结果类似于:
Gender Type Average_Age Sum_Req_IDs
F A 24.5 50
M A 40 23
F B 23.7 100
M B 35.3 200
F C 29.1 30
M C 30.4 98
到目前为止我的代码是:
df.groupby(['Gender','Type'],as_index = False)['Age'].mean()
但这仅返回平均年龄。
你能帮我完成这个吗?
最佳答案
看来你需要 agg
对于聚合列 Age
by mean
和列 Request_ID
到 nunique
:
df = df.groupby(['Gender','Type'],as_index=False).agg({'Age':'mean', 'Request_ID':'nunique'})
#if necessary rename columns
df = df.rename(columns={'Age':'Average_Age','Request_ID':'Sum_Req_IDs'})
print (df)
Gender Type Sum_Req_IDs Average_Age
0 F B 2 23.5
1 M A 2 35.0
2 M C 1 30.0
另一种可能的解决方案是使用嵌套字典
进行聚合
- 输出是列
中的MultiIndex
,其中需要删除顶层由 droplevel
:
df = df.groupby(['Gender','Type']).agg({'Age':{'Average_Age': 'mean'},
'Request_ID':{'Sum_Req_IDs':'nunique'}})
df.columns = df.columns.droplevel(0)
df = df.reset_index()
print (df)
Gender Type Sum_Req_IDs Average_Age
0 F B 2 23.5
1 M A 2 35.0
2 M C 1 30.0
编辑:
对我来说,有点不清楚 Request_ID
是否正确聚合,因此更改数据以获得更好的示例:
print (df)
Age Request_ID Gender Type
0 20 3 M A
1 28 3 F B
2 30 3 M C
3 50 3 M A
4 19 20 F B
#nunique - number of unique values per Gender and Type groups
df1 = df.groupby(['Gender','Type'],as_index=False).agg({'Age':'mean','Request_ID':'nunique'})
print (df1)
Gender Type Request_ID Age
0 F B 2 23.5
1 M A 1 35.0
2 M C 1 30.0
#nunique - number of all values per Gender and Type groups
df2 = df.groupby(['Gender','Type'],as_index = False).agg({'Age':'mean', 'Request_ID':'size'})
print (df2)
Gender Type Request_ID Age
0 F B 2 23.5
1 M A 2 35.0
2 M C 1 30.0
#nunique - sum values per Gender and Type groups
df3 = df.groupby(['Gender','Type'],as_index = False).agg({'Age': 'mean', 'Request_ID':'sum'})
print (df3)
Gender Type Request_ID Age
0 F B 23 23.5
1 M A 6 35.0
2 M C 3 30.0
关于python - 获取数据帧的一列相对于其他两列的平均值和比例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43697747/