如何根据日期与货币匹配规则为DataFrame填充另一DataFrame的汇率列
解决Pandas多条件匹配汇率问题
看起来你需要根据日期和货币两个维度,把exchange_rates里的汇率匹配到prices表中对吧?你之前尝试的match()、np.where和iloc没解决问题,大概率是因为exchange_rates里存在重复的(date, currency)组合,直接单条件匹配或者按位置取值没法处理这种多对一的场景。我来给你一步步搞定:
1. 先统一日期格式(关键!)
首先要把两个表的日期转换成datetime类型,避免因为字符串格式不一致导致匹配失败:
import pandas as pd # 转换日期格式为datetime(原格式是dd-mm-yyyy) prices['date'] = pd.to_datetime(prices['date'], format='%d-%m-%Y') exchange_rates['date'] = pd.to_datetime(exchange_rates['date'], format='%d-%m-%Y')
2. 清理exchange_rates的重复数据
你的exchange_rates表中,同一个日期+货币对应多个汇率值(比如2018-04-13的EUR有3个不同rate),所以得先确定你要取哪种汇率:
- 取平均汇率(最常用)
# 按日期和货币分组,计算平均汇率 exchange_rates_clean = exchange_rates.groupby(['date', 'currency'])['rate'].mean().reset_index()
- 取最后一条记录的汇率
exchange_rates_clean = exchange_rates.groupby(['date', 'currency'])['rate'].last().reset_index()
- 取第一条记录的汇率
exchange_rates_clean = exchange_rates.groupby(['date', 'currency'])['rate'].first().reset_index()
3. 用merge完成多条件匹配
这是Pandas中处理多条件关联最稳妥的方法,直接按date和currency两个字段匹配:
# 左连接合并,保留prices中所有行,匹配不到的rate会显示NaN prices_with_rate = pd.merge(prices, exchange_rates_clean, on=['date', 'currency'], how='left') # 可选:删掉原prices表的空rate列,并重命名新列 prices_with_rate = prices_with_rate.drop('rate_x', axis=1).rename(columns={'rate_y': 'rate'})
示例结果(以平均汇率为例)
处理后的prices_with_rate会是这样:
| date | price | currency | rate |
|---|---|---|---|
| 2018-04-13 | 34 | EUR | 4.0667 |
| 2018-04-14 | 23 | USD | NaN |
| 2018-04-15 | 64 | PLN | NaN |
(注:14、15号的汇率因为exchange_rates里没有对应数据,所以显示NaN,你可以根据需求用fillna填充默认值)
为什么之前的方法不好用?
match():只能处理单条件的模糊匹配,没法同时匹配日期和货币两个字段np.where:多条件嵌套写起来非常繁琐,而且没法处理重复数据的情况iloc:是按行索引位置取值,和你的条件匹配需求完全不匹配
内容的提问来源于stack exchange,提问作者Krzysztof Musialik
相关产品推荐
相关产品推荐

