Левое объединение в пандах без создания левой и правой переменных - PullRequest
0 голосов
/ 03 января 2019

Я что-то упускаю в синтаксисе слияния в пандах.

У меня есть следующие 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)

Но я полагаю, что есть только синтаксис слияния, который мне нужно изменить, чтобы получить его правильно без постобработки. Чего мне не хватает?

1 Ответ

0 голосов
/ 03 января 2019

Я думаю, вам нужно combine_first с MultiIndex, созданным set_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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...