根据第三列中的条件合并两个数据框

时间:2020-08-05 15:29:09

标签: python pandas dataframe merge



我想根据列df1合并两个数据帧(df2PERMNO)。 LPERMNO
df1.merge(df2, left_on='PERMNO', right_on='LPERMNO')

但是,合并时,我还需要考虑date的{​​{1}}列位于{{1}的两个列df1LINKDT的范围之间}},因为LINKENDDT的每一行都有不同的信息(请参见df2的列df2)。

例如,PRC的索引df2应该与[0,1]的索引df1合并
并且0的索引df2应该与[2,3]的索引df1合并,因为2的值在两列df2和{ {1}}。

很遗憾,我在这里迷路了,感谢您的帮助!

df1

date

df2:

LINKDT

更新

预期产量

输出数据帧的形状为2'000'000x180。

LINKENDDT

2 个答案:

答案 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'])