使用For循环按指定名称列表过滤多个DataFrame,代码不生效如何解决
问题排查与修复方案
现有代码错误点
- 数据结构错误:定义的
df1是Python字典,不是Pandas DataFrame对象,无法直接使用DataFrame的筛选语法。 - 列名不匹配:筛选使用的列名为
ColumnName,但示例数据中存储名称的列名是Name,列名对应不上会直接报错或无匹配结果。 - 大小写不匹配:待匹配列表
name_lists中的值均为小写(如name1),但原数据中的名称为首字母大写格式(如Name1),isin为严格匹配,大小写不一致会导致匹配失败。 - 循环赋值无效:循环中的
dataframe是遍历dfs生成的临时变量,直接对其赋值不会修改dfs列表中存储的原DataFrame对象,筛选结果无法保留。
修复后代码
import pandas as pd # 将字典转为DataFrame,df2/df3/df4同理处理 df1 = pd.DataFrame({ "Name" :["Name1", "Name2", "Name3", "Name4"], "X":[30,40,50,60], "Y":[20,30,10,40], "Z":[10,20,20,10] }) # 此处假设df2、df3、df4已经完成DataFrame转换 dfs = [df1, df2, df3, df4] name_lists = ['name1','name2','name3','name5'] # 生成新列表存储筛选后的结果 filtered_dfs = [] for df in dfs: # 把Name列转小写后匹配,规避大小写差异问题 filtered_df = df[df["Name"].str.lower().isin(name_lists)] filtered_dfs.append(filtered_df) # 若需要直接修改原dfs列表,可使用索引遍历赋值 # for i in range(len(dfs)): # dfs[i] = dfs[i][dfs[i]["Name"].str.lower().isin(name_lists)]
如果不需要忽略大小写匹配,可去掉str.lower()方法,同时将name_lists的值调整为和原数据大小写一致的格式即可。
内容的提问来源于stack exchange,提问作者Qthry
相关产品推荐
相关产品推荐

