基于另一DataFrame的上一季度与同ID在Pandas中新增列
解决方案
核心思路是先建立季度与上一季度的映射关系,再通过ident+上一季度的组合去df_test中匹配对应的file值。
先修正原代码笔误
原代码中df.ident是错误写法,需改为df_test.ident,否则会触发变量未定义错误。
步骤1:构建季度映射字典
利用你提供的quarters有序列表,创建一个可快速查询上一季度的字典:
quarter_map = {q: prev_q for q, prev_q in zip(quarters[1:], quarters[:-1])}
这个字典的键为当前季度,值为对应上一季度,比如'2023q1'对应'2022q4','2022q4'对应'2022q3'。
步骤2:为df_test2添加上一季度列
用上述映射字典,给df_test2新增prev_quarter列,存储每行对应的上一季度:
df_test2['prev_quarter'] = df_test2['quarter'].map(quarter_map)
步骤3:构建df_test的查询映射
把df_test转换成以(ident, quarter)为键、file为值的字典,实现O(1)时间复杂度的快速查找:
file_lookup = df_test.set_index(['ident', 'quarter'])['file'].to_dict()
步骤4:填充df_test2的file列
通过apply函数,结合ident和prev_quarter去查询字典,得到对应的file值:
df_test2['file'] = df_test2.apply(lambda row: file_lookup.get((row['ident'], row['prev_quarter'])), axis=1)
完整可运行代码
import pandas as pd quarters = ['2021q1', '2021q2', '2021q3', '2021q4', '2022q1', '2022q2', '2022q3', '2022q4', '2023q1', '2023q2'] # 修正笔误后的df_test初始化 df_test = pd.DataFrame(data=None, columns=['file', 'quarter', 'ident']) df_test.file = ['file_1', 'file_1_v2', 'file_2_old', 'file_2_new', 'file_3'] df_test.quarter = ['2022q4', '2023q2', '2022q2', '2022q3', '2023q1'] df_test.ident = [1, 1, 2, 2, 3] df_test2 = pd.DataFrame(data=None, columns=['quarter', 'ident']) df_test2.quarter = ['2023q1', '2022q4', '2023q2'] df_test2.ident = [1, 2, 3] # 构建季度映射字典 quarter_map = {q: prev_q for q, prev_q in zip(quarters[1:], quarters[:-1])} # 添加上一季度列 df_test2['prev_quarter'] = df_test2['quarter'].map(quarter_map) # 构建查询字典 file_lookup = df_test.set_index(['ident', 'quarter'])['file'].to_dict() # 填充file列 df_test2['file'] = df_test2.apply(lambda row: file_lookup.get((row['ident'], row['prev_quarter'])), axis=1) # 验证结果 print(df_test2['file'].tolist()) # 输出:['file_1', 'file_2_new', 'file_3']
补充说明
- 若
df_test中存在同一ident+quarter对应多个file的情况,set_index会保留最后一行的file值;如需处理重复值,可先对df_test按ident+quarter去重。 - 字典查询的方式对大型数据集更高效,比多次merge操作的时间复杂度更低。
内容的提问来源于stack exchange,提问作者Marcus K.
相关产品推荐
相关产品推荐

