如何根据匹配日期连接两个数据框?

时间:2019-02-20 22:30:00

标签: python pandas dataframe

我想将存储为熊猫数据帧的两个地震目录连接起来。

import pandas as pd

ISC = {'my_index': [0,2,3], 'date': ['2001-03-06', '2001-03-20', '2001-03-30'], 'magnitude': [4.7,4.7,4.9]}
df1 = pd.DataFrame(data=ISC).set_index('my_index')


USGS = {'my_index': [1,4],'date': ['2001-03-20', '2001-03-30'], 'magnitude': [4.8,5]}
df2 = pd.DataFrame(data=USGS).set_index('my_index')

这是目录1(df1):

my_index        date  magnitude                 
0         2001-03-06        4.7
2         2001-03-20        4.7
3         2001-03-30        4.9

目录2(df2):

my_index        date  magnitude                 
1         2001-03-20        4.8
4         2001-03-30        5.0

在连接两个数据帧(df3=pd.concat([df1,df2],axis=1,join='outer'))时,这是我得到的:

my_index        date  magnitude        date  magnitude                                       
0         2001-03-06        4.7         NaN        NaN
1                NaN        NaN  2001-03-20        4.8
2         2001-03-20        4.7         NaN        NaN
3         2001-03-30        4.9         NaN        NaN
4                NaN        NaN  2001-03-30        5.0

但是,连接后,我希望同一天发生的地震出现在同一行上。这是我想要的输出:

index            date  magnitude        date  magnitude                                       
0         2001-03-06        4.7         NaN        NaN 
1         2001-03-20        4.7  2001-03-20        4.8
2         2001-03-30        4.9  2001-03-30        5.0

有什么主意我怎么能达到这个结果?

2 个答案:

答案 0 :(得分:2)

如果您不需要多余的日期列,则只需进行一次merge调用即可。

(df1.merge(df2, on='date', how='left', suffixes=('', '_y'))
    .rename(lambda x: x.replace('_y', ''), axis=1))

         date  magnitude  magnitude
0  2001-03-06        4.7        NaN
1  2001-03-20        4.7        4.8
2  2001-03-30        4.9        5.0

要匹配您的预期输出,请在此处使用set_indexjoin

u = (df1.set_index('date', drop=0)
        .join(df2.set_index('date', drop=0), how='left', lsuffix='', rsuffix='_y')
        .reset_index(drop=1))
u.columns = u.columns.str.replace('_y', '')
u

         date  magnitude        date  magnitude
0  2001-03-06        4.7         NaN        NaN
1  2001-03-20        4.7  2001-03-20        4.8
2  2001-03-30        4.9  2001-03-30        5.0

答案 1 :(得分:0)

似乎需要合并,而不是合并:

df3 = pd.merge(df1, df2, on='date', how='outer')