You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一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)

三、你原代码的问题说明

  1. 变量名错误:df_slo_CKT应该改为df_price
  2. 未定义变量:使用了month[:,None],但只定义了mo= dane["Month"].values,需统一变量名
  3. 条件逻辑错误:你的条件用了<,但需求是<=,会导致7月的行无法匹配到df_price的7月数据
  4. 重复匹配问题:比如10月会同时匹配到7月和8月的记录,导致数据重复,需要额外筛选最大Month的行

内容的提问来源于stack exchange,提问作者Adii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:13:16