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

如何使用dataframe.apply()处理每行数据时保留列名?

解决pandas apply()处理行时保留列名的问题

其实当你使用df.apply(func, axis=1)处理每行数据时,传入函数的Series对象本身就包含列名信息——它的index属性就是原DataFrame的列名列表,不需要额外“传递”,只是可能你没注意到怎么用而已。下面给你几种实用的方案:

方案1:直接从传入的Series中获取列名

在自定义函数里,你可以通过row.index直接拿到当前行对应的所有列名,甚至可以根据列名直接取值:

import pandas as pd

df = pd.DataFrame({'name': ['Alice', 'Bob'], 'age': [25, 30]})

def process_row(row):
    # 获取所有列名并转为列表
    all_columns = row.index.tolist()
    print(f"当前行的列名:{all_columns}")
    
    # 根据列名直接获取对应值
    name_value = row['name']
    age_value = row['age']
    return f"{name_value} is {age_value} years old"

# 应用函数到每行
result = df.apply(process_row, axis=1)
print(result)

方案2:主动将列名作为参数传入函数

如果你希望显式把列名传递给函数,可以借助apply的args参数,把DataFrame的列名列表传进去:

def process_row_with_cols(row, column_names):
    # 遍历列名处理数据
    for col in column_names:
        print(f"列名{col}对应的值:{row[col]}")
    return sum(row.values)

# 传入列名作为额外参数
df.apply(process_row_with_cols, axis=1, args=(df.columns.tolist(),))

方案3:使用itertuples(可选,适合简单场景)

如果你觉得Series的方式不够直观,也可以用df.itertuples()来遍历行,它会返回带字段名的namedtuple,字段名就是原DataFrame的列名:

for row in df.itertuples(index=False):
    # 直接通过列名字段访问值
    print(f"{row.name} is {row.age} years old")

不过注意:itertuples的性能和apply接近,但如果是大型数据集,apply配合向量化操作会更高效。

内容的提问来源于stack exchange,提问作者Cranjis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:39:55