如何在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
相关产品推荐
相关产品推荐

