首页 > 解决方案 > Pandas join/concat 操作合二为一以加入数据帧

问题描述

我有 3 个数据框,如下所示:

>>> a
                     val1
2018-03-04 12:40:00     1
2018-03-04 12:40:01     2
2018-03-04 12:40:02     3
>>> b
                     val2
2018-03-04 12:40:00     5
2018-03-04 12:40:01     2
2018-03-04 12:40:02     1
>>> c
                     val2
2018-03-04 12:40:03    -3
2018-03-04 12:40:04     2
2018-03-04 12:40:05     6

我想将它们“加入并连接”到 1 个数据框中,如下所示:

>>> df
                     val1  val2
2018-03-04 12:40:00     1     5
2018-03-04 12:40:01     2     2
2018-03-04 12:40:02     3     1
2018-03-04 12:40:03   NaN    -3
2018-03-04 12:40:04   NaN     2
2018-03-04 12:40:05   NaN     6

这样类似索引处的任何值都会被合并,而当前不存在的索引处的值只会附加到该索引处。

使用join不起作用:

>>> a.join(c)
                     val1  val2
2018-03-04 12:40:00     1   NaN
2018-03-04 12:40:01     2   NaN
2018-03-04 12:40:02     3   NaN

concat结合使用仍然join不起作用,只是表明join无论如何都无法完成这项工作,因为它不是替换NaN's,而是创建另一列

>>> pd.concat([a,c]).join(b, lsuffix='_x', rsuffix='_y')
                     val1  val2_x  val2_y
2018-03-04 12:40:00   1.0     NaN     5.0
2018-03-04 12:40:01   2.0     NaN     2.0
2018-03-04 12:40:02   3.0     NaN     1.0
2018-03-04 12:40:03   NaN    -3.0     NaN
2018-03-04 12:40:04   NaN     2.0     NaN
2018-03-04 12:40:05   NaN     6.0     NaN

但即便如此,就我而言,无法判断哪个数据帧包含不位于其他数据帧内的索引,以及哪个数据帧具有与另一个数据帧相似的索引,因此解决方案需要是通用的。

我能够在 python 中做到这一点,但我想知道是否有一个 pandas 解决方案,因为 pandas 更高效、更快。

标签: pythonpandasdataframejoinmerge

解决方案


尝试 :

df=pd.concat([a,b,c],sort=False)
df.groupby(df.index).first()

或者:

pd.concat([a,b,c],sort=True).max(level=0)

或者如果只有这 3 个 dfs,您也可以尝试combine_first

a.combine_first(b).combine_first(c)

                     val1  val2
2018-03-04 12:40:00   1.0   5.0
2018-03-04 12:40:01   2.0   2.0
2018-03-04 12:40:02   3.0   1.0
2018-03-04 12:40:03   NaN  -3.0
2018-03-04 12:40:04   NaN   2.0
2018-03-04 12:40:05   NaN   6.0

推荐阅读