【问题标题】:Pandas join/concat operation in one to join dataframesPandas join/concat 操作合二为一以加入数据帧
【发布时间】:2019-09-23 04:50:04
【问题描述】:

我有 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

concatjoin 结合使用仍然不起作用,只是表明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,c])然后df.update(b)吗?

标签: python pandas dataframe join merge


【解决方案1】:

试试:

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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 2012-07-23
      • 2016-03-28
      • 1970-01-01
      • 2018-08-03
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      相关资源
      最近更新 更多