如何在Pandas中根据日期从另一个DataFrame添加新列
问题描述
现有两个DataFrame:
df1(逐日日期数据)
| A | B | Date |
|---|---|---|
| x | a | 03-10-2022 |
| y | b | 02-10-2022 |
| z | c | 01-10-2022 |
| t | d | 30-09-2022 |
| k | e | 29-09-2022 |
| h | f | 28-09-2022 |
| u | g | 27-09-2022 |
df2(周度日期数据)
| unnamed | 14-10-2022 | 07-10-2022 | 30-09-2022 | 23-09-2022 |
|---|---|---|---|---|
| x | a | aa | aaa | aaaa |
| y | b | bb | bbb | bbbb |
| rates | 30.2 | 24.8 | 27.6 | 33.1 |
| z | c | cc | ccc | cccc |
需要将df2中的rates行作为新列Rates添加到df1中,并按照日期区间匹配:
- 14-10-2022及以后:30.2
- 07-10-2022至13-10-2022:24.8
- 30-09-2022至06-10-2022:27.6
- 23-09-2022至29-09-2022:33.1
最终期望结果:
| A | B | Date | Rates |
|---|---|---|---|
| x | a | 03-10-2022 | 27.6 |
| y | b | 02-10-2022 | 27.6 |
| z | c | 01-10-2022 | 27.6 |
| t | d | 30-09-2022 | 27.6 |
| k | e | 29-09-2022 | 33.1 |
| h | f | 28-09-2022 | 33.1 |
| u | g | 27-09-2022 | 33.1 |
实现步骤
1. 导入依赖并构造DataFrame
import pandas as pd import numpy as np # 构造df1 df1 = pd.DataFrame({ 'A': ['x', 'y', 'z', 't', 'k', 'h', 'u'], 'B': ['a', 'b', 'c', 'd', 'e', 'f', 'g'], 'Date': ['03-10-2022', '02-10-2022', '01-10-2022', '30-09-2022', '29-09-2022', '28-09-2022', '27-09-2022'] }) # 构造df2 df2 = pd.DataFrame({ 'unnamed': ['x', 'y', 'rates', 'z'], '14-10-2022': ['a', 'b', 30.2, 'c'], '07-10-2022': ['aa', 'bb', 24.8, 'cc'], '30-09-2022': ['aaa', 'bbb', 27.6, 'ccc'], '23-09-2022': ['aaaa', 'bbbb', 33.1, 'cccc'] })
2. 转换日期格式为datetime类型
将df1的Date列和df2的日期列名统一转换为datetime类型,方便后续区间匹配:
# 转换df1的Date列 df1['Date'] = pd.to_datetime(df1['Date'], format='%d-%m-%Y') # 提取df2中的rates行,并转换列名为datetime rates_row = df2[df2['unnamed'] == 'rates'].iloc[0, 1:] rates_row.index = pd.to_datetime(rates_row.index, format='%d-%m-%Y') # 按日期降序排序,确保区间顺序正确 rates_row = rates_row.sort_index(ascending=False)
3. 按日期区间匹配Rates值
使用numpy.select根据日期区间匹配对应的rates值:
# 获取排序后的日期和对应rates值 date_points = rates_row.index.tolist() rate_values = rates_row.values.tolist() # 定义日期区间条件 conditions = [ df1['Date'] > date_points[0], # 大于14-10-2022 (df1['Date'] <= date_points[0]) & (df1['Date'] > date_points[1]), # 07-10至14-10之间 (df1['Date'] <= date_points[1]) & (df1['Date'] >= date_points[2]), # 30-09至07-10之间 (df1['Date'] < date_points[2]) & (df1['Date'] >= date_points[3]) # 23-09至30-09之间 ] # 对应区间的rates值 values = rate_values # 添加Rates列到df1 df1['Rates'] = np.select(conditions, values)
4. 查看结果
执行上述代码后,df1将生成期望的Rates列,打印结果:
print(df1)
输出结果与期望一致:
A B Date Rates 0 x a 2022-10-03 27.6 1 y b 2022-10-02 27.6 2 z c 2022-10-01 27.6 3 t d 2022-09-30 27.6 4 k e 2022-09-29 33.1 5 h f 2022-09-28 33.1 6 u g 2022-09-27 33.1
内容的提问来源于stack exchange,提问作者Scn
相关产品推荐
相关产品推荐

