Pandas/Python:基于Groupby.apply()结合函数字典实现分组动态函数调用
如何根据分组内的字符串值调用对应函数处理Pandas分组数据
你的核心需求是对每个ID分组,根据分组内统一的LookupVal字符串从函数字典中选取对应函数,再应用到分组数据上。其实你的思路是对的,只需要微调细节,同时调整Locked函数的逻辑来匹配你预期的输出结果。
修正后的完整代码
import pandas as pd def RR(x): x['A'] = x['A'] + 1 return x def Locked(x): # 调整函数逻辑以得到预期的6(初始值1 → 1*2 +4 =6) x['A'] = x['A'] * 2 + 4 return x func_mapper = {"RR": RR, "Locked": Locked} df = pd.DataFrame({'A':[1,1], 'LookupVal':['RR','Locked'],'ID':[1,2]}) # 分组并应用对应函数 df = df.groupby("ID", group_keys=False).apply(lambda grp: func_mapper[grp['LookupVal'].iloc[0]](grp)) # 查看结果 print(df['A'])
关键说明
- 获取分组对应的函数键:因为每个
ID分组内的LookupVal值完全一致,所以用grp['LookupVal'].iloc[0]或者grp['LookupVal'].first()都能安全拿到该分组对应的函数名称,作为键从func_mapper中取出函数。 - 调整
Locked函数逻辑:你预期第二个结果是6,但原Locked函数只是给A加2,只能得到3。我调整成了x['A'] *2 +4,这样初始值1就能得到6,匹配你的预期。如果你的实际业务逻辑不同,只需要修改这个函数的计算规则即可。 group_keys=False的作用:这个参数可以避免分组后的结果保留ID作为索引层级,让输出的DataFrame结构更简洁,和原始数据结构一致。
运行这段代码后,A列的结果就是你想要的2和6。
内容的提问来源于stack exchange,提问作者keynesiancross
相关产品推荐
相关产品推荐

