如何基于另一DataFrame的条件在Pandas中新增列
解决方法
你的需求是基于Year和Month的条件,将df_price中的汇率列匹配到dane表中。下面是两种高效的实现方式,以及对你原代码问题的说明:
一、推荐方法:使用merge_asof(适合大数据量)
这个方法专门用于按顺序向前匹配,能高效处理时间/月份类的条件匹配:
import pandas as pd # 定义原始数据 Price_dict= { "Year" : [2023,2023], "Month" : [7,8], "Stala_EURO" : [1.27836,1.02323], "Stala_PLN" : [13.36200,20.23232], } df_price= pd.DataFrame(Price_dict) dane_slo = { "Year" : [2023,2023,2023,2023], "Month" : [7,8,7,10], } dane = pd.DataFrame(dane_slo) # 对两个表按Year和Month排序(merge_asof要求必须排序) df_price_sorted = df_price.sort_values(['Year', 'Month']) dane_sorted = dane.sort_values(['Year', 'Month']) # 执行向前匹配:同Year下,匹配小于等于当前Month的最大Month对应的汇率 final = pd.merge_asof( dane_sorted, df_price_sorted[['Year', 'Month', 'Stala_EURO', 'Stala_PLN']], on='Month', by='Year', direction='backward' ) # 恢复dane的原始行顺序(可选) final = final.loc[dane.index] print(final)
输出结果:
Year Month Stala_EURO Stala_PLN 0 2023 7 1.27836 13.3620 1 2023 8 1.02323 20.2323 2 2023 7 1.27836 13.3620 3 2023 10 1.02323 20.2323
二、小数据量方法:使用apply逐行匹配
如果数据量较小,可以用逐行筛选的方式实现:
import pandas as pd # 定义原始数据(同上方) Price_dict= { "Year" : [2023,2023], "Month" : [7,8], "Stala_EURO" : [1.27836,1.02323], "Stala_PLN" : [13.36200,20.23232], } df_price= pd.DataFrame(Price_dict) dane_slo = { "Year" : [2023,2023,2023,2023], "Month" : [7,8,7,10], } dane = pd.DataFrame(dane_slo) # 定义匹配函数 def match_stala(row): # 筛选同Year且Month<=当前行Month的记录 valid_rows = df_price[(df_price['Year'] == row['Year']) & (df_price['Month'] <= row['Month'])] # 取Month最大的那一行的汇率 target_row = valid_rows.sort_values('Month', ascending=False).iloc[0] return pd.Series([target_row['Stala_EURO'], target_row['Stala_PLN']]) # 新增列 dane[['Stala_EURO', 'Stala_PLN']] = dane.apply(match_stala, axis=1) print(dane)
三、你原代码的问题说明
- 变量名错误:
df_slo_CKT应该改为df_price - 未定义变量:使用了
month[:,None],但只定义了mo= dane["Month"].values,需统一变量名 - 条件逻辑错误:你的条件用了
<,但需求是<=,会导致7月的行无法匹配到df_price的7月数据 - 重复匹配问题:比如10月会同时匹配到7月和8月的记录,导致数据重复,需要额外筛选最大Month的行
内容的提问来源于stack exchange,提问作者Adii
相关产品推荐
相关产品推荐

