我在合并大熊猫时缺少语法。
我有以下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)
但是我想我只需要更改合并语法就可以正确处理它,而无需进行后处理。我想念什么?
答案 0 :(得分:1)
我认为您需要combine_first
和set_index
创建的MultiIndex
:
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()