【问题标题】:Left join in pandas without the creation of left and right variables在不创建左右变量的情况下左加入熊猫
【发布时间】:2019-01-03 15:59:27
【问题描述】:

我在 pandas 中的合并语法中遗漏了一些东西。

我有以下 2 个数据框:

>>> dfA
  s_name  geo    zip  date value
0  A002X  zip  60601  2010  None
1  A002Y  zip  60601  2010  None
2  A003X  zip  60601  2010  None
3  A003Y  zip  60601  2010  None

(或者可能存在一些不会与 dfB 重叠的值:

>>> dfA_alternate
  s_name  geo    zip  date value
0  A002X  zip  60601  2010   NaN
1  A002Y  zip  60601  2010   2.0
2  A003X  zip  60601  2010   NaN
3  A003Y  zip  60601  2010   NaN

)

>>> dfB
  s_name  geo    zip  date  value
0  A002X  zip  60601  2010    1.0
1  A002Y  zip  60601  2010    NaN
3  A003Y  zip  60601  2010    4.0

我想将 dfB 中存在的数据加入 dfA,如下所示:

>>> new
  s_name  geo    zip  date value
0  A002X  zip  60601  2010   1.0
1  A002Y  zip  60601  2010   NaN
2  A003X  zip  60601  2010   NaN
3  A003Y  zip  60601  2010   4.0

(或

>>> new_alternate
  s_name  geo    zip  date value
0  A002X  zip  60601  2010   1.0
1  A002Y  zip  60601  2010   2.0
2  A003X  zip  60601  2010   NaN
3  A003Y  zip  60601  2010   4.0

)

然而,看似自然的语法实际上会产生额外的列:

>>> pd.merge(dfA,dfB,on=["s_name","geo","zip","date"],how="left")
  s_name  geo    zip  date value_x  value_y
0  A002X  zip  60601  2010    None      1.0
1  A002Y  zip  60601  2010    None      NaN
2  A003X  zip  60601  2010    None      NaN
3  A003Y  zip  60601  2010    None      4.0

(

>>> # alternate
>>> pd.merge(dfA_alterate,dfB,on=["s_name","geo","zip","date"],how="left")
  s_name  geo    zip  date value_x  value_y
0  A002X  zip  60601  2010     NaN      1.0
1  A002Y  zip  60601  2010     2.0      NaN
2  A003X  zip  60601  2010     NaN      NaN
3  A003Y  zip  60601  2010     NaN      4.0

)

value_xvalue_y 我宁愿只拥有价值。

我知道我可以在事后清理它:

new["value"] = new.apply(lambda r: r.value_x or r.value_y, axis=1)
new.drop(["value_x", "value_y"], axis=1, inplace=True)

但我想我只需要更改合并语法即可在不进行后处理的情况下使其正确。我错过了什么?

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    我认为你需要combine_firstMultiIndexset_index 创建:

    cols = ["s_name","geo","zip","date"]
    
    df = dfA.set_index(cols).combine_first(dfB.set_index(cols)).reset_index()
    print (df)
      s_name  geo    zip  date  value
    0  A002X  zip  60601  2010    1.0
    1  A002Y  zip  60601  2010    2.0
    2  A003X  zip  60601  2010    NaN
    3  A003Y  zip  60601  2010    4.0
    

    update:

    df = dfA.set_index(cols)
    df.update(dfB.set_index(cols))
    df = df.reset_index()
    

    【讨论】:

    • 更新!是的,我就是这么想的!
    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2015-12-18
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多