如何在DataFrame指定列上调度存储于字典中的pandas函数?
需求可实现,两种方案解决你的问题
你的核心需求完全可以实现,之前报错是因为混淆了pandas顶级函数和Series实例方法的调用方式,下面给出两种直接可用的方案:
方案1:存储Series方法的名称字符串
这种方式最直观,因为你想要的example_df["ABC"].func1()本质是调用Series的实例方法,直接存储方法名的字符串,通过getattr来动态调用:
示例代码
import pandas as pd # 1. 创建示例DataFrame example_df = pd.DataFrame({ "ABC": [1, None, 3, None, 5], "DEF": ["a", "b", "a", "c", "b"] }) # 2. 构建调度字典:键为列名,值为对应Series的方法名列表 dispatcher = { "ABC": ["isnull", "sum", "mean"], "DEF": ["unique", "nunique"] } # 3. 遍历执行对应列的方法 for col_name, method_names in dispatcher.items(): series = example_df[col_name] print(f"=== 处理列 {col_name} ===") for method in method_names: # 通过getattr获取方法并调用 result = getattr(series, method)() print(f"{method}: {result}")
方案2:存储可调用对象(含自定义函数)
如果需要包含自定义函数,或者不想用方法名字符串,可以直接存储包装好的可调用对象(比如lambda、自定义函数),这种方式更灵活:
示例代码
import pandas as pd # 1. 自定义函数示例 def range_func(series): return series.max(skipna=True) - series.min(skipna=True) # 2. 创建示例DataFrame example_df = pd.DataFrame({ "ABC": [1, None, 3, None, 5], "DEF": ["a", "b", "a", "c", "b"] }) # 3. 构建调度字典:键为列名,值为可调用对象列表 dispatcher = { "ABC": [ lambda s: s.isnull(), lambda s: s.sum(skipna=True), range_func # 加入自定义函数 ], "DEF": [ lambda s: s.unique(), lambda s: s.nunique() ] } # 4. 遍历执行函数 for col_name, funcs in dispatcher.items(): series = example_df[col_name] print(f"=== 处理列 {col_name} ===") for idx, func in enumerate(funcs, 1): result = func(series) print(f"函数{idx}: {result}")
关于你之前的错误说明
你之前写的dispatcher = {"ABC": pd.isnull},pd.isnull是pandas的顶级函数,正确调用方式是pd.isnull(example_df["ABC"]),而不是example_df["ABC"].pd.isnull()——后者会试图找Series的pd属性,自然会报AttributeError。如果想把pd.isnull加入字典,用方案2的方式包装即可:lambda s: pd.isnull(s)。
内容的提问来源于stack exchange,提问作者Jakub Sapko
相关产品推荐
相关产品推荐

