如何使用Pandas按年份拆分DataFrame生成新数据表?
按年份拆分DataFrame的解决方案
问题需求
将包含多年份季度数据的原始DataFrame,拆分为按年份划分的独立DataFrame(2022年对应df1,2023年对应df2),保留id和type列,仅提取对应年份的季度数据列。
原始DataFrame
id type Q1 22 Q2 22 Q3 22 Q1 23 Q2 23 Q3 23 aa hi 0.2 0.8 0.3 1.1 2.1 0.4 aa ok 0.2 0.7 0.3 0.5 1.0 1.7 aa hello 2.0 0.1 0.0 0.1 0.1 0.1
期望结果
df1(2022年数据)
id type Q1 22 Q2 22 Q3 22 aa hi 0.2 0.8 0.3 aa ok 0.2 0.7 0.3 aa hello 2.0 0.1 0.0
df2(2023年数据)
id type Q1 23 Q2 23 Q3 23 aa hi 1.1 2.1 0.4 aa ok 0.5 1.0 1.7 aa hello 0.1 0.1 0.1
错误代码分析
你尝试的代码存在以下问题:
- 原始DataFrame中不存在
year列,因此sort_values(by='year')和set_index(keys=['year'])会直接抛出KeyError。 df.name是DataFrame的元数据属性,并非数据中的年份字段,df.loc[df.name=='2023']的逻辑完全不成立。
可行解决方案
方法一:直接筛选列(适合年份较少的场景)
利用列名中的年份标识(22对应2022,23对应2023),直接提取目标列:
import pandas as pd # 构造原始DataFrame(如果已有可跳过这一步) data = { 'id': ['aa', 'aa', 'aa'], 'type': ['hi', 'ok', 'hello'], 'Q1 22': [0.2, 0.2, 2.0], 'Q2 22': [0.8, 0.7, 0.1], 'Q3 22': [0.3, 0.3, 0.0], 'Q1 23': [1.1, 0.5, 0.1], 'Q2 23': [2.1, 1.0, 0.1], 'Q3 23': [0.4, 1.7, 0.1] } df = pd.DataFrame(data) # 提取2022年数据 df1 = df[['id', 'type'] + [col for col in df.columns if '22' in col]] # 提取2023年数据 df2 = df[['id', 'type'] + [col for col in df.columns if '23' in col]]
方法二:通用分组方式(适合年份较多的场景)
自动识别所有年份,批量生成对应DataFrame:
import pandas as pd # 构造原始DataFrame(如果已有可跳过这一步) data = { 'id': ['aa', 'aa', 'aa'], 'type': ['hi', 'ok', 'hello'], 'Q1 22': [0.2, 0.2, 2.0], 'Q2 22': [0.8, 0.7, 0.1], 'Q3 22': [0.3, 0.3, 0.0], 'Q1 23': [1.1, 0.5, 0.1], 'Q2 23': [2.1, 1.0, 0.1], 'Q3 23': [0.4, 1.7, 0.1] } df = pd.DataFrame(data) # 从列名中提取所有年份 years = list(set(col.split()[-1] for col in df.columns if col not in ['id', 'type'])) # 用字典存储各年份的DataFrame year_dfs = {} for year in years: # 生成对应年份的DataFrame,命名规则为df+年份后两位 year_dfs[f'df{year}'] = df[['id', 'type'] + [col for col in df.columns if year in col]] # 获取目标DataFrame df1 = year_dfs['df22'] df2 = year_dfs['df23']
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

