Python 如何根据匹配的日期连接两个数据帧?
我想连接两个存储为数据帧的地震目录Python 如何根据匹配的日期连接两个数据帧?,python,pandas,dataframe,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', '
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):
和目录2(df2):
当连接两个数据帧(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
你知道我怎样才能达到这个结果吗?似乎需要合并,而不是一个concat:
df3 = pd.merge(df1, df2, on='date', how='outer')
如果您不需要额外的日期列,那么只需一个
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_index
和join
:
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
这需要大量的工作来产生OP的预期输出。
(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
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