如何使用过滤函数处理多个DataFrame并生成DataFrame列表
解决无法生成DataFrame列表的可行方案
先排查核心问题
- 确认
dfs是有效的可迭代DataFrame集合:先打印len(dfs)和type(dfs),如果它不是列表/可迭代的DataFrame容器(比如是字典、生成器),循环逻辑会直接失效。 - 检查过滤结果是否为空:如果某个df里没有匹配正则的列,
df.filter(...)会返回空DataFrame,看似没追加,实际是追加了空对象。可以在循环里加print(filtered_df.shape)验证。
修正后的代码方案
方案1:只追加非空的过滤结果
如果需要跳过无匹配列的DataFrame,用以下代码:
out = [] for df in dfs: filtered_df = df.filter(regex=r"key|words|find(?=[^\d]|$)") if not filtered_df.empty: out.append(filtered_df)
方案2:先把dfs转为标准列表
如果你的dfs不是列表(比如来自字典值、生成器),先转成列表再处理:
# 先将dfs转为列表 dfs_list = list(dfs) out = [df.filter(regex=r"key|words|find(?=[^\d]|$)") for df in dfs_list]
方案3:用列表推导式简化逻辑
列表推导式比循环+append更稳定,也更简洁:
# 带非空判断的版本 def filter_target_df(df): return df.filter(regex=r"key|words|find(?=[^\d]|$)") out = [filtered_df for df in dfs if not (filtered_df := filter_target_df(df)).empty]
额外验证手段
- 生成列表后,打印
len(out)确认数量是否符合预期; - 遍历
out打印type(item),确保每个元素都是pandas.DataFrame; - 检查正则是否准确:如果关键词需要忽略大小写,给
filter加flags=re.IGNORECASE参数,比如df.filter(regex=r"key|words|find(?=[^\d]|$)", flags=re.IGNORECASE)
内容的提问来源于stack exchange,提问作者user18708380
相关产品推荐
相关产品推荐

