如何通过循环遍历Python DataFrame按年份生成多个子DataFrame
如何通过循环遍历Python DataFrame按年份生成多个子DataFrame
嘿,我来帮你搞定这个问题!作为Python新手,你想通过循环按年份拆分DataFrame的思路完全没问题,但你尝试的动态命名变量写法(比如"y" + str(x) = ...)是行不通的,而且这种方式其实也不是最佳实践——后续要管理这些零散的变量会特别麻烦。我给你推荐两种可行的方案,优先选第一种哦!
方案一:用字典存储子DataFrame(强烈推荐)
用字典来存每个年份的子DataFrame是最规范的做法,不仅创建方便,后续调用、遍历处理都超级省心。
步骤1:确保Date列是datetime类型
如果你的Date列还不是datetime格式,先做转换:
import pandas as pd # 假设你的DataFrame是df df['Date'] = pd.to_datetime(df['Date'])
步骤2:循环生成子DataFrame并存入字典
# 定义要处理的年份列表 years = [2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023] # 创建空字典用来存储各年份的DataFrame year_dataframes = {} for year in years: # 筛选对应年份的数据,字典的键可以用"Y2023"这种格式,方便识别 year_dataframes[f"Y{year}"] = df[df['Date'].dt.year == year]
怎么调用子DataFrame?
比如要查看2023年的数据,直接这样写:
print(year_dataframes['Y2023'])
后续批量处理更方便
比如要把每个年份的子DataFrame保存成单独的CSV文件,直接循环字典就行:
for df_name, sub_df in year_dataframes.items(): sub_df.to_csv(f"{df_name}.csv", index=False)
方案二:动态创建全局变量(不推荐,但满足你的需求)
如果你一定要生成Y2023、Y2022这种独立变量,可以用globals()函数,但要注意这会污染全局命名空间,后续维护起来很头疼,所以非必要不建议用:
for year in years: # 动态创建全局变量,变量名是Y+年份 globals()[f"Y{year}"] = df[df['Date'].dt.year == year]
这样之后你就能直接像之前硬编码那样用Y2023、Y2022这些变量了。
处理多个文件的扩展
如果要处理多个文件,把拆分逻辑封装成函数就可以循环调用了:
def split_df_by_year(input_df, target_years): # 先转换日期格式 input_df['Date'] = pd.to_datetime(input_df['Date']) year_dfs = {} for year in target_years: year_dfs[f"Y{year}"] = input_df[input_df['Date'].dt.year == year] return year_dfs # 假设你有多个文件路径存在列表里 file_list = ["data_2007_2023.csv", "another_data.csv", ...] # 用一个大字典存储所有文件的子DataFrame all_year_dfs = {} for file_path in file_list: # 读取文件 current_df = pd.read_csv(file_path) # 拆分当前文件的DataFrame current_year_dfs = split_df_by_year(current_df, years) # 把结果存入大字典,键用"文件名_年份"区分 file_name = file_path.split('.')[0] for df_name, sub_df in current_year_dfs.items(): all_year_dfs[f"{file_name}_{df_name}"] = sub_df
备注:内容来源于stack exchange,提问作者then00b
相关产品推荐
相关产品推荐

