我想根据列df1
合并两个数据帧(df2
和PERMNO
)。 LPERMNO
:
df1.merge(df2, left_on='PERMNO', right_on='LPERMNO')
但是,合并时,我还需要考虑date
的{{1}}列位于{{1}的两个列df1
和LINKDT
的范围之间}},因为LINKENDDT
的每一行都有不同的信息(请参见df2
的列df2
)。
例如,PRC
的索引df2
应该与[0,1]
的索引df1
合并
并且0
的索引df2
应该与[2,3]
的索引df1
合并,因为2
的值在两列df2
和{ {1}}。
很遗憾,我在这里迷路了,感谢您的帮助!
df1
date
df2:
LINKDT
更新 :
预期产量
输出数据帧的形状为2'000'000x180。
LINKENDDT
答案 0 :(得分:1)
尝试:
df_merged = df1.merge(df2, left_on=['PERMNO'], right_on=['LPERMNO'])
# if ['date', 'LINKDT', 'LINKENDDT'] already are in datetime format, ignore this three lines
df_merged['date'] = pd.to_datetime(df_merged['date'])
df_merged['LINKDT'] = pd.to_datetime(df_merged['LINKDT'])
df_merged['LINKENDDT'] = pd.to_datetime(df_merged['LINKENDDT'])
# Assuming LINKDT < LINKENDDT
df_merged = df_merged[(df_merged['date'] >= df_merged['LINKDT']) & (df_merged['date'] <= df_merged['LINKENDDT'])]
输出:
PERMNO date LPERMNO LINKDT LINKENDDT PRC
0 66325 2006-03-30 66325 1992-07-01 2014-04-30 10.0
3 66325 2006-06-30 66325 1992-07-01 2014-04-30 10.0
8 66325 2015-09-30 66325 2014-05-01 2019-12-31 8.5
11 66325 2015-12-30 66325 2014-05-01 2019-12-31 8.5
答案 1 :(得分:0)
我不知道是否有任何更简单/更快/更好的方法,但这就是我的建议。对于.merge()而言,您尝试获取的合并似乎有点复杂,而尝试在列上使用条件。
permno = []
date = []
linkdt = []
linkenddt = []
prc = []
for i in range(0, df1.shape[0]):
for j in range(0, df2.shape[0]):
if (df1['PERMNO'][i]==df2['LPERMNO'][j]) & (df1['date'][i] > df2['LINKDT'][j]) & (df1['date'][i] < df2['LINKENDDT'][j]):
permno.append(df1['PERMNO'][i])
date.append(df1['date'][i])
linkdt.append(df2['LINKDT'][j])
linkenddt.append(df2['LINKENDDT'][j])
prc.append(df2['PRC'][j])
merged = pd.DataFrame(list(zip(permno, linkdt, date, linkenddt, prc)),
columns = ['PERMNO', 'LINKDT', 'LINKENDDT', 'PRC'])