如何使用行索引和列名为参数的函数向量化填充Pandas DataFrame
解决方案
最优向量化实现方案
核心思路是先构造和目标DataFrame形状完全匹配的行索引矩阵、列名矩阵,直接批量传入自定义函数计算,全程无逐元素循环,性能远高于apply写法。
完整代码示例:
import pandas as pd import numpy as np # 初始化原始DataFrame data = pd.DataFrame(0, index=[1,2,3,4], columns=[1,2,3,4]) # 自定义函数 def multiply(a, b): return a * b # 构造行索引矩阵、列名矩阵(和data形状一致) row_mat, col_mat = np.meshgrid(data.index, data.columns, indexing='ij') # 向量化计算后覆盖原DataFrame data = pd.DataFrame(multiply(row_mat, col_mat), index=data.index, columns=data.columns)
如果你的自定义函数包含不支持数组运算的逻辑(比如条件判断),可以用np.vectorize包装函数后再调用:
# 示例:带判断逻辑的自定义函数 def custom_calc(a, b): if a > b: return a * 2 + b else: return a + b * 2 # 包装为向量化函数 vec_calc = np.vectorize(custom_calc) # 计算赋值 data = pd.DataFrame(vec_calc(row_mat, col_mat), index=data.index, columns=data.columns)
原有写法的问题&修正(不推荐,性能差)
之前嵌套apply写法报错是因为args参数要求传入元组,单个元素需要加逗号才能识别为元组,修正后可运行但不推荐在数据量较大的场景使用:
# 仅作修正演示,生产环境优先使用向量化方案 data = data.apply(lambda x: x.apply(multiply, args=(x.name,)))
输出结果示例:
1 2 3 4 1 1 2 3 4 2 2 4 6 8 3 3 6 9 12 4 4 8 12 16
内容的提问来源于stack exchange,提问作者Ibrahim Berber
相关产品推荐
相关产品推荐

