Python pandas如何分组并根据列的特定值生成对应新列
Pandas实现主客场指标行转列分组方案
你需要的是将HA维度的行记录拆分为主客场独立列,按Team(含你代码框架里的Liga字段)分组输出,以下是两种可直接运行的实现方式:
方式1:基于你已写的groupby+agg框架实现
完全贴合你现有代码结构,直接补全agg逻辑即可:
df_ad = df_calc.groupby(['Team', 'Liga']).agg( Home_attack=('attack', lambda s: s[df_calc.loc[s.index, 'HA'] == 'Home'].iloc[0]), Home_defense=('defense', lambda s: s[df_calc.loc[s.index, 'HA'] == 'Home'].iloc[0]), Away_attack=('attack', lambda s: s[df_calc.loc[s.index, 'HA'] == 'Away'].iloc[0]), Away_defense=('defense', lambda s: s[df_calc.loc[s.index, 'HA'] == 'Away'].iloc[0]) ).reset_index()
方式2:用pivot行转列实现(更简洁高效)
和你给出的CASE WHEN SQL逻辑完全等价,是pandas处理这类行转列需求的标准写法,可读性和执行效率都更高:
# 按HA维度拆分指标为多列 df_ad = df_calc.pivot( index=['Team', 'Liga'], columns='HA', values=['attack', 'defense'] ) # 拼接多层列名为目标格式:主客场_指标名 df_ad.columns = [f'{ha}_{metric}' for metric, ha in df_ad.columns] # 重置索引把Team、Liga从索引转回普通列 df_ad = df_ad.reset_index()
补充说明
- 以上代码默认每个
Team+Liga+HA组合下只有1条记录,如果存在多条重复记录,把代码里的.iloc[0]替换成你需要的聚合规则即可,比如取均值用.mean()、求和用.sum() - 如果输出列顺序和你预期的
Home_attack、Home_defense、Away_attack、Away_defense不一致,加一行代码重排即可:df_ad = df_ad[['Team', 'Liga', 'Home_attack', 'Home_defense', 'Away_attack', 'Away_defense']]
输入表样例:
输出表样例:
内容的提问来源于stack exchange,提问作者ignaciomedinar
相关产品推荐
相关产品推荐



