假设我有两个数据帧,如下所示:
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