Я что-то упускаю в синтаксисе слияния в пандах.
У меня есть следующие 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)
Но я полагаю, что есть только синтаксис слияния, который мне нужно изменить, чтобы получить его правильно без постобработки. Чего мне не хватает?