You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas实操:如何基于DataFrame特定单元格值重命名并重塑列

Pandas DataFrame 拆分转换与列重命名实现

原始数据结构

match_id player venue goals
1        John   home  4
1        Jim    home  0
1        Will   away  0 
1        Dan    away  1
...

需求说明

基于venue列的值,将长格式DataFrame转换为宽格式,为每个场地的球员添加编号,并生成[场地]_player_[编号]和[场地]_player_[编号]_goals格式的列。

实现代码

import pandas as pd

# 示例数据(可替换为实际业务数据)
df = pd.DataFrame({
    'match_id': [1, 1, 1, 1],
    'player': ['John', 'Jim', 'Will', 'Dan'],
    'venue': ['home', 'home', 'away', 'away'],
    'goals': [4, 0, 0, 1]
})

# 1. 给同一场比赛、同一场地的球员添加连续编号(从1开始)
df['player_seq'] = df.groupby(['match_id', 'venue']).cumcount() + 1

# 2. 分别将球员姓名、进球数转换为宽表格式
player_wide = df.pivot(index='match_id', columns=['venue', 'player_seq'], values='player')
goals_wide = df.pivot(index='match_id', columns=['venue', 'player_seq'], values='goals')

# 3. 重命名列,匹配目标格式
player_wide.columns = [f'{ven}_player_{seq}' for ven, seq in player_wide.columns]
goals_wide.columns = [f'{ven}_player_{seq}_goals' for ven, seq in goals_wide.columns]

# 4. 合并两张宽表,并调整列顺序让球员列和对应进球列相邻
final_df = pd.concat([player_wide, goals_wide], axis=1)
# 按球员编号排序列,保证字段顺序符合需求
sorted_cols = sorted(final_df.columns, key=lambda x: (x.split('_player_')[1], x))
final_df = final_df[sorted_cols].reset_index()

print(final_df)

关键逻辑说明

  • groupby(['match_id', 'venue']).cumcount()+1:针对每个比赛+场地的分组,为球员生成唯一编号,区分同组内的不同球员
  • pivot:将长表转为宽表,以比赛ID为索引,场地+球员编号作为列的层级,实现字段的横向展开
  • 列名拼接:遍历列层级信息,直接生成需求指定的命名格式
  • 列排序:通过提取球员编号作为排序依据,确保每个球员字段和对应的进球字段相邻展示

内容的提问来源于stack exchange,提问作者8-Bit Borges

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:01:35