如何避免Pandas中遍历公式列表的for循环?需调用行级函数
如何避免遍历公式列表的for循环并保留行级函数处理?
当然可以避免显式的for循环,以下是两种简洁的实现方式,同时保留行级函数处理的逻辑:
方法1:字典推导式 + assign批量添加列
通过字典推导式一次性生成所有需要的新列,再用assign()方法批量合并到原DataFrame:
import pandas as pd def calculate(x, formula): return eval(formula) col = { 's1':{'l':100, 'w':200}, 's2':{'l':200, 'w':400}, 's3':{'l':300, 'w':500} } coldf = pd.DataFrame.from_dict(col, orient='index') formulacol = [{'key':'a', 'formula':"x['l']*x['w']"},{'key':'p', 'formula':"x['l']+x['w']+x['l']+x['w']"}] # 用字典推导式构建所有新列,再批量添加 new_columns = { item['key']: coldf.apply(lambda x: calculate(x, item['formula']), axis=1) for item in formulacol } coldf = coldf.assign(**new_columns) print(coldf)
方法2:单apply生成多列并join
自定义一个行处理函数,一次性返回所有新列的结果,再通过join()合并到原DataFrame:
import pandas as pd def calculate(x, formula): return eval(formula) col = { 's1':{'l':100, 'w':200}, 's2':{'l':200, 'w':400}, 's3':{'l':300, 'w':500} } coldf = pd.DataFrame.from_dict(col, orient='index') formulacol = [{'key':'a', 'formula':"x['l']*x['w']"},{'key':'p', 'formula':"x['l']+x['w']+x['l']+x['w']"}] # 单apply生成包含所有新列的Series def process_row(x): return pd.Series({ item['key']: calculate(x, item['formula']) for item in formulacol }) coldf = coldf.join(coldf.apply(process_row, axis=1)) print(coldf)
注意事项
这两种方式只是去掉了代码中的显式for循环,内部仍会处理每个公式,但代码结构更贴合pandas的风格。另外,eval()存在安全风险,如果公式来自不可信来源,建议改用AST模块解析公式逻辑。
内容的提问来源于stack exchange,提问作者arun712
相关产品推荐
相关产品推荐

