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
相关产品推荐
相关产品推荐

