如何从另一DataFrame选取数据为当前DataFrame创建新列
错误原因
- 语法层面:你写的apply代码缺少右括号,本身无法正常解析运行
- 逻辑层面:
df2[df2['Date'] == row.Date]['Indicator']返回的是Series对象而非单个数值,直接赋值给df1的列会出现维度不匹配错误 - 性能层面:逐行遍历的apply方式在数据量较大时执行效率极低,不推荐使用
正确实现方法
两种常用的高效实现方式,按需选择即可:
方法1:使用merge左连接(最通用,适合多字段匹配场景)
直接按日期字段对两个表做左连接,保留销售表的所有行,匹配到的经济指标自动填充,匹配不到的日期默认填充NaN:
import pandas as pd # 先统一日期格式,避免匹配失败 df1['Date'] = pd.to_datetime(df1['Date']) df2['Date'] = pd.to_datetime(df2['Date']) # 左连接合并,并重命名指标列为Rate df1 = df1.merge(df2, on='Date', how='left').rename(columns={'Indicator': 'Rate'})
方法2:使用map映射(写法更简洁,适合单字段匹配场景)
把经济指标表转成日期为索引的映射关系,直接对销售表的日期列做映射:
import pandas as pd df1['Date'] = pd.to_datetime(df1['Date']) df2['Date'] = pd.to_datetime(df2['Date']) df1['Rate'] = df1['Date'].map(df2.set_index('Date')['Indicator'])
结果说明
用你提供的示例数据执行后,最终df1的输出如下:
| Date | 分类 | 销售额 | Rate |
|---|---|---|---|
| 2021-05-04 | A | 56 | 1.4 |
| 2021-05-04 | B | 40 | 1.4 |
| 2021-05-05 | B | 40 | 1.8 |
| 2021-05-07 | A | 20 | NaN |
如果需要处理NaN值,可以使用df1['Rate'] = df1['Rate'].fillna(默认值)填充你需要的默认数值。
内容的提问来源于stack exchange,提问作者Juicy
相关产品推荐
相关产品推荐

