python - 获取数据帧的一列相对于其他两列的平均值和比例

标签 python pandas dataframe

我有一个包含 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_IDnunique :

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/

相关文章:

python - 通过 PyQt4 在 QT 中绘制图形 ALA Graphviz

python - 从字符串中提取值

python - Dataframe set_index 产生重复的索引值而不是进行分层分组

python - 如何使用 python 使用回归模型将预测值转换为 NaN 输入值

r - 从每一行获取索引并与原始 data.frame 合并

在 R 中重新排列数据框

python - f=1 时 python 中的 pbft 实现

python - 在 Python 中使用 Beautifulsoup 时出现 HTML 列表理解问题

python - 根据字典重命名 Pandas 中的列

重新排序 R data.frame 的子集,同时修改行名称