【发布时间】: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_x 和 value_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