如何在单个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
相关产品推荐
相关产品推荐

