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

如何基于另一行字符串重命名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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:35:18