我有两个数据帧要合并:
df1看起来像这样:
Date Col1 Col 2 Col 3 Col 4
2016-03 27.57 0.93 28.7 1.57
2016-04 25.83 0.23 28.34 0.84
2016-05 24.55 0.27 27.11 0.03
df2看起来是这样的:
Date ColA
2016-03-21 7.640769230769231
2016-03-22 7.739720279720279
2016-03-23 7.577311827956988
2016-03-24 7.745416666666666
正如您所看到的,df1是每月数据,df2是每日数据。然而,我想将它们合并为每日格式(遵循df2),但我也希望df1滞后(滞后=-30)
这是我想要的输出:
输出:
Date ColA Col1 Col 2 Col 3 Col 4
2016-03-21 7.640769230769231 25.83 0.23 28.34 0.84
2016-03-22 7.739720279720279 25.83 0.23 28.34 0.84
2016-03-23 7.577311827956988 25.83 0.23 28.34 0.84
2016-03-24 7.745416666666666 25.83 0.23 28.34 0.84
....2016-04-01 xxxxxxxx 24.55 0.27 27.11 0.03
我试过了,但是,它们只是合并了,没有应用滞后。
out = (df2.merge(df1.shift(-30), on='Date').axis=1)
编辑:由于我无法使以下建议对我的具体问题有效,我所做的是:
out['Col1']= out['Col1'].shift(7).dropna()
out = pd.merge_asof(df1, df2, on = 'Date')
这是只滞后1列(我决定这样做,因为大多数列都可能有不同的滞后时间
对于合并使用merge_asof
:
print (df1)
Date Col1 Col 2 Col 3 Col 4
0 2016-03 27.57 0.93 28.70 1.57
1 2016-04 25.83 0.23 28.34 0.84
2 2016-05 24.55 0.27 27.11 0.03
df1['Date'] = pd.to_datetime(df1['Date'])
print (df1)
Date Col1 Col 2 Col 3 Col 4
0 2016-03-01 27.57 0.93 28.70 1.57
1 2016-04-01 25.83 0.23 28.34 0.84
2 2016-05-01 24.55 0.27 27.11 0.03
np.random.seed(20)
df2 = pd.DataFrame({'Date': pd.date_range('2016-02-20', periods=20),
'ColA': np.random.randint(5, size=20)})
print (df2)
Date ColA
0 2016-02-20 3
1 2016-02-21 2
2 2016-02-22 4
3 2016-02-23 2
4 2016-02-24 1
5 2016-02-25 4
6 2016-02-26 3
7 2016-02-27 2
8 2016-02-28 0
9 2016-02-29 0
10 2016-03-01 2
11 2016-03-02 2
12 2016-03-03 3
13 2016-03-04 3
14 2016-03-05 0
15 2016-03-06 0
16 2016-03-07 1
17 2016-03-08 2
18 2016-03-09 2
19 2016-03-10 3
#default direction='backward'
df = pd.merge_asof(df2, df1, on='Date', tolerance=pd.Timedelta(7, 'days'))
print (df)
Date ColA Col1 Col 2 Col 3 Col 4
0 2016-02-20 3 NaN NaN NaN NaN
1 2016-02-21 2 NaN NaN NaN NaN
2 2016-02-22 4 NaN NaN NaN NaN
3 2016-02-23 2 NaN NaN NaN NaN
4 2016-02-24 1 NaN NaN NaN NaN
5 2016-02-25 4 NaN NaN NaN NaN
6 2016-02-26 3 NaN NaN NaN NaN
7 2016-02-27 2 NaN NaN NaN NaN
8 2016-02-28 0 NaN NaN NaN NaN
9 2016-02-29 0 NaN NaN NaN NaN
10 2016-03-01 2 27.57 0.93 28.7 1.57
11 2016-03-02 2 27.57 0.93 28.7 1.57
12 2016-03-03 3 27.57 0.93 28.7 1.57
13 2016-03-04 3 27.57 0.93 28.7 1.57
14 2016-03-05 0 27.57 0.93 28.7 1.57
15 2016-03-06 0 27.57 0.93 28.7 1.57
16 2016-03-07 1 27.57 0.93 28.7 1.57
17 2016-03-08 2 27.57 0.93 28.7 1.57
18 2016-03-09 2 NaN NaN NaN NaN
19 2016-03-10 3 NaN NaN NaN NaN
df = pd.merge_asof(df2, df1, on='Date',
tolerance=pd.Timedelta(7, 'days'), direction='forward')
print (df)
Date ColA Col1 Col 2 Col 3 Col 4
0 2016-02-20 3 NaN NaN NaN NaN
1 2016-02-21 2 NaN NaN NaN NaN
2 2016-02-22 4 NaN NaN NaN NaN
3 2016-02-23 2 27.57 0.93 28.7 1.57
4 2016-02-24 1 27.57 0.93 28.7 1.57
5 2016-02-25 4 27.57 0.93 28.7 1.57
6 2016-02-26 3 27.57 0.93 28.7 1.57
7 2016-02-27 2 27.57 0.93 28.7 1.57
8 2016-02-28 0 27.57 0.93 28.7 1.57
9 2016-02-29 0 27.57 0.93 28.7 1.57
10 2016-03-01 2 27.57 0.93 28.7 1.57
11 2016-03-02 2 NaN NaN NaN NaN
12 2016-03-03 3 NaN NaN NaN NaN
13 2016-03-04 3 NaN NaN NaN NaN
14 2016-03-05 0 NaN NaN NaN NaN
15 2016-03-06 0 NaN NaN NaN NaN
16 2016-03-07 1 NaN NaN NaN NaN
17 2016-03-08 2 NaN NaN NaN NaN
18 2016-03-09 2 NaN NaN NaN NaN
19 2016-03-10 3 NaN NaN NaN NaN
df = pd.merge_asof(df2, df1, on='Date',
tolerance=pd.Timedelta(7, 'days'), direction='nearest')
print (df)
Date ColA Col1 Col 2 Col 3 Col 4
0 2016-02-20 3 NaN NaN NaN NaN
1 2016-02-21 2 NaN NaN NaN NaN
2 2016-02-22 4 NaN NaN NaN NaN
3 2016-02-23 2 27.57 0.93 28.7 1.57
4 2016-02-24 1 27.57 0.93 28.7 1.57
5 2016-02-25 4 27.57 0.93 28.7 1.57
6 2016-02-26 3 27.57 0.93 28.7 1.57
7 2016-02-27 2 27.57 0.93 28.7 1.57
8 2016-02-28 0 27.57 0.93 28.7 1.57
9 2016-02-29 0 27.57 0.93 28.7 1.57
10 2016-03-01 2 27.57 0.93 28.7 1.57
11 2016-03-02 2 27.57 0.93 28.7 1.57
12 2016-03-03 3 27.57 0.93 28.7 1.57
13 2016-03-04 3 27.57 0.93 28.7 1.57
14 2016-03-05 0 27.57 0.93 28.7 1.57
15 2016-03-06 0 27.57 0.93 28.7 1.57
16 2016-03-07 1 27.57 0.93 28.7 1.57
17 2016-03-08 2 27.57 0.93 28.7 1.57
18 2016-03-09 2 NaN NaN NaN NaN
19 2016-03-10 3 NaN NaN NaN NaN
IIUC,您可以使用:
df1['Date'] = pd.to_datetime(df1['Date'])
df2['Date'] = pd.to_datetime(df2['Date'])
out = (df2.merge(df1.assign(Date=df1['Date'].sub(pd.DateOffset(months=1))
.dt.to_period('M')),
left_on=df2['Date'].dt.to_period('M'), right_on='Date',
how='left', suffixes=(None, '_df1'))
)
或:
out = (df2.merge(df1.assign(Date=df1['Date'].dt.to_period('M').sub(1)),
left_on=df2['Date'].dt.to_period('M'), right_on='Date',
how='left', suffixes=(None, '_df1'))
)
输出:
Date ColA Date_df1 Col1 Col 2 Col 3 Col 4
0 2016-03-21 7.640769 2016-03 25.83 0.23 28.34 0.84
1 2016-03-22 7.739720 2016-03 25.83 0.23 28.34 0.84
2 2016-03-23 7.577312 2016-03 25.83 0.23 28.34 0.84
3 2016-03-24 7.745417 2016-03 25.83 0.23 28.34 0.84