求助:遍历DataFrame列表并更新DataFrame的有效方法
问题解决:遍历DataFrame列表保留指定列
你的问题出在循环中的变量赋值不会修改原DataFrame对象:当你在for df in [df1, df2, df3]里执行df = df.filter(regex='FLAG')时,df只是原DataFrame的临时引用,赋值后它指向了新生成的过滤后DataFrame,原df1/df2/df3并没有被修改。
下面是两种可行的解决方法:
方法一:列表推导式批量生成处理后的DataFrame
直接用列表推导式生成过滤后的DataFrame列表,再重新赋值给原变量:
import pandas as pd df1 = pd.DataFrame(columns=['FREQUNECY_ID', 'START_DATE', 'END_DATE', 'FLAG_ACTIVE', 'FLAG_CURRENT']) df2 = pd.DataFrame(columns=['PRODUCT_ID', 'PURCHASE_DATE', 'FLAG_ACTIVE', 'FLAG_CURRENT']) df3 = pd.DataFrame(columns=['FREQUNECY_ID', 'START_DATE', 'END_DATE', 'FLAG_ACTIVE', 'FLAG_CURRENT']) # 批量过滤并重新赋值 df1, df2, df3 = [df.filter(regex='FLAG') for df in [df1, df2, df3]] print(df3.columns) # 输出: Index(['FLAG_ACTIVE', 'FLAG_CURRENT'], dtype='object')
方法二:通过索引遍历修改列表元素
先把DataFrame存入列表,通过索引修改列表内的元素,再按需重新赋值给原变量:
import pandas as pd df1 = pd.DataFrame(columns=['FREQUNECY_ID', 'START_DATE', 'END_DATE', 'FLAG_ACTIVE', 'FLAG_CURRENT']) df2 = pd.DataFrame(columns=['PRODUCT_ID', 'PURCHASE_DATE', 'FLAG_ACTIVE', 'FLAG_CURRENT']) df3 = pd.DataFrame(columns=['FREQUNECY_ID', 'START_DATE', 'END_DATE', 'FLAG_ACTIVE', 'FLAG_CURRENT']) dfs = [df1, df2, df3] # 按索引遍历,直接替换列表中的元素 for i in range(len(dfs)): dfs[i] = dfs[i].filter(regex='FLAG') # 若需要保留原变量名,重新赋值 df1, df2, df3 = dfs print(df3.columns)
另外,你注释里的列表推导式写法有误,正确写法是:
col_lst = [col for col in df.columns if 'FLAG' in col] df = df[col_lst]
这个逻辑和filter(regex='FLAG')效果一致,可按需选择。
内容的提问来源于stack exchange,提问作者rams
相关产品推荐
相关产品推荐

