如何将pandas Series操作作为参数传入自定义函数
问题解决
核心错误原因
- 变量名大小写不匹配:函数参数定义为
series,但函数内部错误使用大写开头的Series调用,属于变量名拼写错误 - 方法调用逻辑错误:不能直接用
df[col].func的语法调用传入的方法参数,需要先获取Series对应的方法对象再执行 - 传参格式错误:调用时写的
mean()属于直接执行函数,当前作用域没有独立定义mean函数所以触发NameError,就算有对应函数,也会把执行结果而非函数本身传入自定义函数
实现方案
方案1:传入方法名字符串(推荐,适配pandas Series原生方法)
自定义函数通过getattr动态获取Series的对应方法执行:
import numpy as np import pandas as pd def get_info(df, series_col, func_name): target_series = df[series_col] # 动态获取Series的对应方法 method = getattr(target_series, func_name) # 执行方法并返回结果 return method() # 测试数据 data = np.random.randint(10, size=(3, 4)) df = pd.DataFrame(data, columns=['a', 'b', 'c', 'd']) # 示例调用,求d列均值 mn = get_info(df, 'd', 'mean') print(mn)
如果方法需要传参,比如求指定分位数,可调整函数支持参数透传:
def get_info(df, series_col, func_name, *args, **kwargs): target_series = df[series_col] method = getattr(target_series, func_name) return method(*args, **kwargs) # 调用示例:求d列的25%分位数 q25 = get_info(df, 'd', 'quantile', q=0.25)
方案2:传入可调用对象(适配numpy函数/自定义函数)
如果需要传入numpy运算函数或者自定义运算逻辑,可使用该方案:
def get_info(df, series_col, func): target_series = df[series_col] return func(target_series) # 调用示例,传入numpy的mean方法 mn = get_info(df, 'd', np.mean) # 也支持传入自定义函数,比如求最大值减最小值 range_calc = lambda x: x.max() - x.min() d_range = get_info(df, 'd', range_calc)
内容的提问来源于stack exchange,提问作者RickRyan
相关产品推荐
相关产品推荐

