Python Pandas join/concat操作一次连接数据帧

Python Pandas join/concat操作一次连接数据帧,python,pandas,dataframe,join,merge,Python,Pandas,Dataframe,Join,Merge,我有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

我有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
>>> 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
我希望将它们“连接并连接”到1个数据帧中,如下所示:

>>> 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
>>> 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
,而是创建另一列

>>> 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更高效、更快。

试试:

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

或者,如果只有这3个dfs,您也可以先尝试组合:

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

你能试一下
df=pd.concat([a,c])
然后
df.update(b)
                     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