You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单个for循环中过滤、拆分并保存多个DataFrame

问题说明

你当前循环只能拿到最后一个国家结果的核心原因是:每次迭代都会重新给df_filtered、df1、df2赋值,上一轮的结果会被直接覆盖,没有做持久化存储。
你现有的筛选、拆分逻辑本身是通顺的,仅存在一处语法问题:query的f-string写法存在引号嵌套错误,外层用双引号时内部匹配字符串需要改用单引号,否则会报语法错。
你提到的用容器存储每轮结果的思路是正确的,不需要为每个国家单独提前创建列表,用字典统一管理是最方便维护的方案。


方案1:字典统一存储(推荐)

用国家名作为字典的键,对应值存储拆分后的两个DataFrame元组,后续查询、遍历都非常方便,也不会污染全局命名空间:

# 初始化结果存储字典
country_splits = {}

for country in df["country"].unique():
    # 修正原query的引号嵌套问题
    df_filtered = df.query(f'country == "{country}"')
    # 按50%比例拆分
    part1 = df_filtered.sample(frac=0.5, random_state=1)
    part2 = df_filtered.drop(part1.index)
    # 存入字典
    country_splits[country] = (part1, part2)

使用时直接按国家名取值即可,例如获取印度尼西亚的两个拆分结果:

Indonesia_df1, Indonesia_df2 = country_splits["Indonesia"]

如果国家名包含空格、特殊字符(比如样例里的Western Sahara),这种方式也不需要额外处理国家名,不会出现变量名非法的问题。


方案2:动态生成独立命名变量(非常不推荐)

如果你一定要得到[国家名]_df1、[国家名]_df2格式的零散全局变量,可以通过globals()动态注册变量,但这种方式会产生大量全局变量,后续调试、维护成本很高,仅做参考:

for country in df["country"].unique():
    df_filtered = df.query(f'country == "{country}"')
    part1 = df_filtered.sample(frac=0.5, random_state=1)
    part2 = df_filtered.drop(part1.index)
    # 替换国家名中的空格为下划线,避免变量名非法
    country_key = country.replace(" ", "_")
    globals()[f"{country_key}_df1"] = part1
    globals()[f"{country_key}_df2"] = part2

运行后就可以直接通过Ukraine_df1、Western_Sahara_df2这类变量名访问对应拆分结果。


内容的提问来源于stack exchange,提问作者asmodeus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 02:36:31