Python 如何基于df1中的日期将两个数据帧连接到>;=df2中的日期
我有一个带有关键ID、状态、开始日期和其他特征的大数据帧。我还有另一个数据框,上面有状态、开始日期和一个“1”表示标志 我想加入这两个,因为状态和df1中的日期大于或等于df2中的日期 以下面的例子为例Python 如何基于df1中的日期将两个数据帧连接到>;=df2中的日期,python,pandas,join,Python,Pandas,Join,我有一个带有关键ID、状态、开始日期和其他特征的大数据帧。我还有另一个数据框,上面有状态、开始日期和一个“1”表示标志 我想加入这两个,因为状态和df1中的日期大于或等于df2中的日期 以下面的例子为例df1是状态表、开始日期和标志的1df2是一个数据帧,如果df2中的日期是=df1中的日期,则需要这些标志。最终结果是df3。唯一的观测结果是状态匹配且日期为原始日期的标志 import pandas as pd dict1 = {'date':['2020-01-01', '2020-02-1
df1
是状态表、开始日期和标志的1df2
是一个数据帧,如果df2中的日期是=
df1中的日期,则需要这些标志。最终结果是df3
。唯一的观测结果是状态匹配且日期为原始日期的标志
import pandas as pd
dict1 = {'date':['2020-01-01', '2020-02-15', '2020-02-04','2020-03-17',
'2020-06-15'],
'state':['AL','FL','MD','NC','SC'],
'flag': [1,1,1,1,1]}
df1 = pd.DataFrame(dict1)
df1['date'] = pd.to_datetime(df1['date'])
dict2 = {'state': ['AL','FL','MD','NC','SC'],
'keyid': ['001','002','003','004','005'],
'start_date':['2020-02-01', '2020-01-15', '2020-01-30','2020-05-18',
'2020-05-16']}
df2 = pd.DataFrame(dict2)
df2['start_date'] = pd.to_datetime(df2['start_date'])
df3 = df2
df3['flag'] = [0,1,1,0,1]
如何以编程方式访问df3?我的实际df1
每个状态都有一行。我实际的df2
有超过一百万个不同日期的观察结果。使用和:
用于按参数按更大或相等的日期时间进行合并direction='forward'
:
“向前”搜索选择右数据帧中的第一行,其“开”键大于或等于左键
您还可以重命名
列,以避免在输出数据帧中追加:
df2['need'] = [0,1,1,0,1]
df1 = df1.sort_values('date')
df2 = df2.sort_values('start_date')
df = pd.merge_asof(df2,
df1.rename(columns={'date':'start_date'}),
on='start_date',
by='state',
direction='forward')
df['flag'] = df['flag'].fillna(0).astype(int)
print (df)
state keyid start_date need flag
0 FL 002 2020-01-15 1 1
1 MD 003 2020-01-30 1 1
2 AL 001 2020-02-01 0 0
3 SC 005 2020-05-16 1 1
4 NC 004 2020-05-18 0 0
df2['need'] = [0,1,1,0,1]
df1 = df1.sort_values('date')
df2 = df2.sort_values('start_date')
df = pd.merge_asof(df2,
df1,
left_on='start_date',
right_on='date',
by='state',
direction='forward')
df['flag'] = df['flag'].fillna(0).astype(int)
print (df)
state keyid start_date need date flag
0 FL 002 2020-01-15 1 2020-02-15 1
1 MD 003 2020-01-30 1 2020-02-04 1
2 AL 001 2020-02-01 0 NaT 0
3 SC 005 2020-05-16 1 2020-06-15 1
4 NC 004 2020-05-18 0 NaT 0
df2['need'] = [0,1,1,0,1]
df1 = df1.sort_values('date')
df2 = df2.sort_values('start_date')
df = pd.merge_asof(df2,
df1.rename(columns={'date':'start_date'}),
on='start_date',
by='state',
direction='forward')
df['flag'] = df['flag'].fillna(0).astype(int)
print (df)
state keyid start_date need flag
0 FL 002 2020-01-15 1 1
1 MD 003 2020-01-30 1 1
2 AL 001 2020-02-01 0 0
3 SC 005 2020-05-16 1 1
4 NC 004 2020-05-18 0 0