按索引添加数据帧,如果不存在索引则删除



假设我有两个数据帧,如下所示:

df1 =
t   val
2019-08-22 02:00:00   0.1
2019-08-24 02:00:00   0.2
2019-08-26 02:00:00   0.3
2019-08-28 02:00:00   0.4
2019-08-30 02:00:00   0.5
df2 =    
t   val
2019-08-24 02:00:00   0.3
2019-08-26 02:00:00   0.4
2019-08-28 02:00:00   0.5
2019-08-30 02:00:00   0.6

如果它们的大小相同,我可以这样做来添加相对于索引t:的值

df_sum = df1.set_index('t') + df2.set_index('t')

然而,在这种情况下,df2没有df1那么多行,所以这将失败,并且我将获得一些NaN行(至少这是我得到的(。那么,有没有办法只根据索引添加数据帧,然后删除两者中不存在的行?从而产生与最小行数相同的数据帧?

第一个想法是使用默认的内部联接和求和列合并:

df = df1.merge(df2, on='t').set_index('t').sum(axis=1).to_frame('val')
print (df)
val
t                       
2019-08-24 02:00:00  0.5
2019-08-26 02:00:00  0.7
2019-08-28 02:00:00  0.9
2019-08-30 02:00:00  1.1

或者使用Index.intersection并通过DataFrame.loc:仅选择两个DataFrame中的行

df11 = df1.set_index('t') 
df22 = df2.set_index('t')
idx = df11.index.intersection(df22.index)
df = df11.loc[idx] + df22.loc[idx]
print (df)
val
t                       
2019-08-24 02:00:00  0.5
2019-08-26 02:00:00  0.7
2019-08-28 02:00:00  0.9
2019-08-30 02:00:00  1.1

如果原始数据中没有错误的值,则添加DataFrame.dropna以仅删除添加的缺失值:

df = (df1.set_index('t') + df2.set_index('t')).dropna()
print (df)
val
t                       
2019-08-24 02:00:00  0.5
2019-08-26 02:00:00  0.7
2019-08-28 02:00:00  0.9
2019-08-30 02:00:00  1.1

最新更新