如何在无需后续按名称访问的情况下,为任意数量的Pandas DataFrame批量应用同一函数?
嘿,这个问题很常见,尤其是当你处理动态生成的DataFrame时!我来给你几个实用的方案,完全不用之后逐个去索引或按名称访问每个处理后的结果:
第一步:先把所有目标DataFrame收集到可迭代对象中
如果你已经有了df1、df2……dfn这些单独命名的DataFrame,首先得把它们集中到一个列表里。最便捷的方式是从全局/局部命名空间里筛选出符合命名规则的DataFrame:import pandas as pd # 筛选所有以"df"开头且是Pandas DataFrame类型的变量 df_collection = [var for name, var in globals().items() if name.startswith('df') and isinstance(var, pd.DataFrame)]当然,如果你的DataFrame命名规则不一样,只要调整
startswith里的字符串就行,比如如果是data_1、data_2,就改成name.startswith('data_')。第二步:批量应用你的函数
接下来就可以对整个列表批量处理了,推荐用列表推导式(比循环更简洁),或者map函数:
先定义你要应用的处理函数,比如:def my_processing_func(df): # 这里写你的具体处理逻辑,比如新增列、过滤数据、计算统计值等 df['processed_col'] = df['original_col'].apply(lambda x: x * 3) # 如果是需要返回处理后的DataFrame,记得加return return df然后批量处理:
# 得到所有处理后的DataFrame组成的列表 processed_dfs = [my_processing_func(df) for df in df_collection]这样你就有了所有处理后的结果集合,后续如果需要批量操作(比如合并所有处理后的DataFrame),直接对
processed_dfs操作就行,完全不用逐个访问df1、df2这些单独的变量。备选:原地修改(谨慎使用)
如果你不需要保留原DataFrame,想直接修改原对象,可以用循环原地操作:for df in df_collection: # 原地修改,比如删除不需要的列 df.drop(columns=['unnecessary_col'], inplace=True)注意:这种方式会直接改变原来的
df1、df2等变量,没有返回新的对象,适合不需要保留原始数据的场景。额外小技巧:如果之后偶尔需要按原名称访问
要是你之后偶尔需要对应原名称找处理后的DataFrame,可以用字典来存储:processed_df_map = {name: my_processing_func(var) for name, var in globals().items() if name.startswith('df') and isinstance(var, pd.DataFrame)}之后要找
df3的处理结果,就用processed_df_map['df3'],但这只是备选,完全不影响你批量处理的需求。
备注:内容来源于stack exchange,提问作者Elis

