Python Pandas join/concat操作一次连接数据帧
我有3个数据帧,如下所示: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
>>> 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