Слияние панд, условное обновление в конфликтующих столбцах - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть два кадра данных, df1 & df2 (см. Ниже), которые я хотел бы

  1. merge в одном из общих столбцов

  2. условно обновить другие общие столбцы.

Пример фрейма данных и ожидаемые результаты.

df1:
   A    B     C
0  123  1819. NaN  
1  456  NaN   115
2  789  9012. NaN
3  121  8732. NaN
4  883  NaN   171
5  771  8871. 191
# df2:
     C      B
0  115  41853
1  115  22723
2  115  57302
3  115  91494
4  171  43607
5  171  36327
6  191  39874
7  191  25456
8  191  76283
9  191  97506
  1. merge в столбце C
# how='left' is necessary
pd.merge(df1, df2, on='C', how='left')
      A     B_x      C      B_y
0   123  1819.0    NaN      NaN
1   456     NaN  115.0  41853.0
2   456     NaN  115.0  22723.0
3   456     NaN  115.0  57302.0
4   456     NaN  115.0  91494.0
5   789  9012.0    NaN      NaN
6   121  8732.0    NaN      NaN
7   883     NaN  171.0  43607.0
8   883     NaN  171.0  36327.0
9   771     NaN  191.0  39874.0
10  771     NaN  191.0  25456.0
11  771     NaN  191.0  76283.0
12  771     NaN  191.0  97506.0
Условно объедините столбцы B_x и B_y, т. Е. Замените значения NaN в left_table ( B_x ) значениями не NaN с right_table ( B_y )

PS: Предположим, что оба B_x и B_y никогда не бывают одновременно NaN

Конечный результат:

      A      C       B
0   123    NaN    1819
1   456  115.0   41853
2   456  115.0   22723
3   456  115.0   57302
4   456  115.0   91494
5   789    NaN    9012
6   121    NaN    8732
7   883  171.0   43607
8   883  171.0   36327
9   771  191.0   39874
10  771  191.0   25456
11  771  191.0   76283
12  771  191.0   97506

Мне известна функция объединить_первый , но она работает только с indices.

1 Ответ

0 голосов
/ 02 апреля 2019

После merge с использованием np.where

df=pd.merge(df1, df2, on='C', how='left')
df['B']=np.where(df.B_x.isnull(),df.B_y,df.B_x)
df.drop(['B_x','B_y'],1,inplace=True)
df
Out[136]: 
      A      C        B
0   123    NaN   1819.0
1   456  115.0  41853.0
2   456  115.0  22723.0
3   456  115.0  57302.0
4   456  115.0  91494.0
5   789    NaN   9012.0
6   121    NaN   8732.0
7   883  171.0  43607.0
8   883  171.0  36327.0
9   771  191.0   8871.0
10  771  191.0   8871.0
11  771  191.0   8871.0
12  771  191.0   8871.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...