如何基于另一行字符串重命名Pandas DataFrame中的行字符串?
处理Pandas DataFrame类名与运动名称拼接的方案
核心思路
先定位第0行中所有类名的位置,再按类名的列区间,给第1行对应的运动名称加上所属类前缀,最后再设置表头。
具体代码实现
1. 提取类名位置信息
从第0行筛选出所有类名及其所在列的索引,用来划分后续运动列的归属范围:
import pandas as pd df = pd.DataFrame({"a":["","DATE","01-01-2012"], "b":["","ID",18], "c":["CLASS A","GOLF",3], "d":["","HOCKEY",4], "e":["","BASEBALL",2], "f":["CLASS B","GOLF",15], "g":["","HOCKEY",2], "h":["","BASEBALL",3] }) # 获取第0行的类名和对应列索引 row0 = df.iloc[0] class_info = [(idx, val) for idx, val in enumerate(row0) if val.startswith("CLASS")]
2. 批量拼接类名与运动名称
遍历每个类对应的列区间,给第1行的运动名称加上类前缀,跳过DATE、ID这类非运动字段:
# 逐个处理每个类的列范围 for i in range(len(class_info)): start_idx, class_name = class_info[i] # 确定当前类覆盖的最后一列索引 end_idx = len(df.columns)-1 if i == len(class_info)-1 else class_info[i+1][0]-1 # 遍历区间内的所有列 for col_idx in range(start_idx, end_idx+1): sport = df.iloc[1, col_idx] if sport not in ("DATE", "ID"): df.iloc[1, col_idx] = f"{class_name} - {sport}"
3. 设置表头并清理数据
按你熟悉的方式设置第1行为表头,删除原表头行:
# 设置第1行为新表头 df.columns = df.iloc[1] # 删除原第0、1行,重置索引 df = df.drop([0, 1]).reset_index(drop=True)
最终结果
处理后的DataFrame如下:
DATE ID CLASS A - GOLF CLASS A - HOCKEY CLASS A - BASEBALL CLASS B - GOLF CLASS B - HOCKEY CLASS B - BASEBALL 0 01-01-2012 18 3 4 2 15 2 3
为什么不用iterrows?
iterrows是按行遍历,而这里需要按列的归属区间处理,直接通过列索引操作更高效,逻辑也更清晰,避免逐行遍历的冗余操作。
内容的提问来源于stack exchange,提问作者user026
相关产品推荐
相关产品推荐

