pandas DataFrame复杂透视:将特殊结构CSV转换为指定格式数据表
实现思路
原数据为按球员分块存储的非标准结构化数据,核心处理逻辑为:先识别出球员名称并给对应统计行填充球员归属,再通过两次长宽表转换得到目标格式。
完整实现代码
import pandas as pd import numpy as np # 1. 读取数据并重命名首列 # 若读取时分钟段列名识别为整数,将后续代码中字符串格式的列名替换为整数即可 df = pd.read_csv("你的本地CSV文件路径.csv") df = df.rename(columns={df.columns[0]: "Stat"}) # 2. 识别球员行并填充球员归属列 # 球员行判定规则:除首列外所有列值均为NaN,且首列本身非空 player_mask = df.drop("Stat", axis=1).isna().all(axis=1) & df["Stat"].notna() df["Player"] = np.where(player_mask, df["Stat"], np.nan) # 向前填充,给每个统计行标注所属球员 df["Player"] = df["Player"].ffill() # 3. 清洗无效行,完成表结构转换 # 过滤掉球员自身行、全空行,仅保留有效统计数据行 df_clean = df[~player_mask & df["Stat"].notna()].copy() # 第一步宽转长:把分钟段从列名转换为行值 df_melt = df_clean.melt( id_vars=["Player", "Stat"], value_vars=["5", "10", "15", "20"], var_name="MinuteSplits", value_name="Value" ) # 第二步长转宽:把统计项(Total/Walking等)从行值转换为列 df_result = df_melt.pivot( index=["Player", "MinuteSplits"], columns="Stat", values="Value" ).reset_index() # 调整列顺序为期望结构 df_result = df_result[["Player", "MinuteSplits", "Total", "Walking", "Jogging", "Sprinting"]]
输出验证
运行后df_result即为你需要的目标结构,可直接通过print(df_result)查看结果。
内容的提问来源于stack exchange,提问作者Christian Rønsholt
相关产品推荐
相关产品推荐

