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

如何在pandas.DataFrame.apply中传入行名与列名作为参数?

在Pandas中传递行名与列名到函数(非嵌套循环实现)

可以用apply实现吗?

可以,通过嵌套apply结合lambda捕获行/列名即可实现。示例代码如下:

import pandas as pd

countries = ["Germany", "France", "Belgium"]
years = [2030, 2040, 2050]
df = pd.DataFrame(columns=countries, index=years)

def myFunc(countryname, year):
    return countryname + str(year)

# 外层按行遍历获取年份,内层按列元素遍历获取国家名称
df = df.apply(lambda row: row.apply(lambda _, year=row.name: myFunc(_.name, year)), axis=1)

外层apply(axis=1)遍历每一行,row.name获取当前年份;内层apply遍历该行的每个列元素,_.name获取当前国家名称,最终传递给myFunc生成结果。


非嵌套循环的更高效实现

如果要彻底避免嵌套循环(包括列表推导式的嵌套),推荐以下两种高性能实现:

方法1:利用Numpy广播机制

广播是Numpy的核心特性,能自动匹配维度完成元素级操作,完全无需循环:

import pandas as pd
import numpy as np

countries = ["Germany", "France", "Belgium"]
years = [2030, 2040, 2050]

# 将国家转为行向量,年份转为列向量并转字符串
countries_arr = np.array(countries)[np.newaxis, :]
years_arr = np.array(years)[:, np.newaxis].astype(str)

# 广播自动匹配维度,直接拼接字符串
result = countries_arr + years_arr

# 转换为目标DataFrame
df = pd.DataFrame(result, columns=countries, index=years)

方法2:利用MultiIndex生成笛卡尔积

通过from_product直接生成行名和列名的所有组合,再转换为DataFrame:

import pandas as pd

countries = ["Germany", "France", "Belgium"]
years = [2030, 2040, 2050]

# 生成包含所有(年份,国家)组合的MultiIndex
mi = pd.MultiIndex.from_product([years, countries], names=["year", "country"])

# 对每个组合应用函数,再转换为宽表格式
s = pd.Series(mi.map(lambda x: x[1] + str(x[0])), index=mi)
df = s.unstack(level="country")

这两种方法都避开了显式循环,性能远优于循环类实现,适合处理大规模数据集。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 02:36:07