Pandas如何遍历dataframe并按多条件拆分生成新dataframe?
实现方案
你需要的多条件全组合拆分DataFrame可以通过以下两种高效方式实现,无需手动编写每条筛选逻辑:
方案一:按目标列直接分组(推荐)
直接使用pandas原生groupby方法按四个目标列分组,自动匹配所有存在数据的条件组合,性能最优:
# 按4个维度分组,groups会自动聚合所有存在的组合对应的行 groups = df.groupby(["Z_year", "Z_month", "Z_group", "time_range"]) # 遍历所有分组处理子DataFrame for (year, month, group, time_range), sub_df in groups: # 示例:将子DataFrame导出为独立文件,空间数据可替换为geopandas的to_file方法 filename = f"data_{year}_{month}_{group}_{time_range.replace(' ', '_')}.csv" sub_df.to_csv(filename, index=False) # 若需要将所有子DataFrame存入字典后续调用,可提前初始化字典存储: # sub_df_dict[(year, month, group, time_range)] = sub_df
该方案的优势:
- 自动覆盖所有存在数据的组合,无需提前手动枚举所有可能值
- 底层为pandas优化实现,处理效率远高于手动循环筛选
- 自动跳过无数据的空组合,避免生成无效空文件
方案二:强制覆盖全枚举组合
如果你需要哪怕某组合无对应数据也要生成对应空文件,可以先枚举所有你列出的唯一值组合再筛选:
from itertools import product # 定义所有维度的枚举值 year_list = [2020, 2021] month_list = [5, 8, 11] group_list = ["weekday", "weekend"] time_range_list = ["08:00 to 12:00", "12:00 to 18:00", "18:00 to 01:00"] # 生成所有组合的笛卡尔积 all_combs = product(year_list, month_list, group_list, time_range_list) for year, month, group, time_range in all_combs: # 筛选符合条件的子数据(注意修正你原代码中`df.loc['Z_group']`的错误写法,取列直接用df['列名']即可) sub_df = df[(df["Z_year"] == year) & (df["Z_month"] == month) & (df["Z_group"] == group) & (df["time_range"] == time_range)] # 导出逻辑同上 filename = f"data_{year}_{month}_{group}_{time_range.replace(' ', '_')}.csv" sub_df.to_csv(filename, index=False)
内容的提问来源于stack exchange,提问作者littlerhizomeman
相关产品推荐
相关产品推荐

