如何使用pandas的groupby/pivot功能实现指定DataFrame的结构转换
数据转换实现方案
完全可以通过pivot透视表或者groupby配合自定义函数实现需求,两种常用实现方式如下:
方法1:pivot透视表实现(写法更简洁)
直接通过透视操作将长表转为宽表,再计算性别比值即可:
import pandas as pd # 构造和你结构一致的测试数据 df = pd.DataFrame({ 'Year': [2018, 2018, 2019, 2019], 'Gender': ['Female', 'Male', 'Female', 'Male'], 'Count': [4010, 19430, 3212, 16138] }) # 长表转宽表 res = df.pivot(index='Year', columns='Gender', values='Count').reset_index() # 计算Ratio保留2位小数 res['Ratio'] = (res['Female'] / res['Male']).round(2) # 调整列顺序匹配要求的输出格式 res = res[['Year', 'Male', 'Female', 'Ratio']] print(res)
输出结果和你要求的完全一致:
Year Male Female Ratio 0 2018 19430 4010 0.21 1 2019 16138 3212 0.20
方法2:groupby + 自定义聚合实现(扩展性更强)
如果后续需要增加更多分组聚合逻辑,可以用groupby配合自定义函数实现:
def group_agg(group): male = group.loc[group['Gender'] == 'Male', 'Count'].iloc[0] female = group.loc[group['Gender'] == 'Female', 'Count'].iloc[0] return pd.Series({ 'Male': male, 'Female': female, 'Ratio': round(female/male, 2) }) res = df.groupby('Year', group_keys=False).apply(group_agg, include_groups=False).reset_index() print(res)
两种方案都可以实现你的转换需求,根据实际场景选择即可。
内容的提问来源于stack exchange,提问作者user12460992
相关产品推荐
相关产品推荐

