加入两个Pandas数据帧,这些数据帧具有共同的重复索引而无需执行笛卡尔积

时间:2018-03-14 18:06:08

标签: python pandas

有没有办法在不使用笛卡尔积的情况下加入两个具有共同重复索引的Pandas数据帧? E.g:

df1 = pd.DataFrame(data={'event':['A','C','D']}, index=[1.,3.,3.])
df2 = pd.DataFrame(data={'event':['B','C']}, index=[2.,3.])

注意事件C记录在两个帧中,CD都具有相同的索引值(时间戳)。

df1.join(df2,how='outer',lsuffix='1',rsuffix='2')

给出:

    event1 event2
1.0      A    NaN
2.0    NaN      B
3.0      C      C
3.0      D      C

CC)和(DC)行是CD在{的笛卡尔积{1}}和df1中的C。我希望第4行只是(df2D),因为NaN只出现在D而不出现在df1中,即:

df2

1 个答案:

答案 0 :(得分:3)

您需要在第二个merge指数列上cumcount

i, j = [
    x.set_index(x.groupby(level=0).cumcount(), append=True) for x in (df1, df2)
]

i.merge(
    j, 
    left_index=True, 
    right_index=True, 
    how='outer', 
    suffixes=('1', '2')
).reset_index(level=1, drop=True)

    event1 event2
1.0      A    NaN
2.0    NaN      B
3.0      C      C
3.0      D    NaN