Как объединить два DataFrames следующим образом? - PullRequest
1 голос
/ 09 марта 2020

У меня есть два pandas DataFrame.

df1 выглядит так:

Date        A   B
2020-03-01  12  15
2020-03-02  13  16
2020-03-03  14  17

, а df2, вот так:

Date        C
2020-03-03  x
2020-03-01  w
2020-03-05  y

Я хочу объединить df2 в df1 так, чтобы значения превратились в столбцы. Вроде как горячая кодировка:

Date        A   B   w  x  y  z
2020-03-01  12  15  1  0  0  0
2020-03-02  13  16  0  0  0  1
2020-03-03  14  17  0  1  0  0

Таким образом, первая строка имеет 1 в столбце w, потому что строка с той же датой, "2020-03-01" в df2['C'] «ш». Столбец z предназначен для тех записей в df1 без соответствующих дат в df2. (Извините, если я не смог объяснить это лучше. Не стесняйтесь уточнить.)

В качестве решения я подумал сначала о слиянии df1 и df2, например:

Date        A   B   C
2020-03-01  12  15  w
2020-03-02  13  16  -
2020-03-03  14  17  x

Затем выполните однократное кодирование, используя:

df1['w'] = (df2['C'] == 'w')*1.0
df1['y'] = (df2['C'] == 'y')*1.0
...

Но я все еще думаю о том, как кодировать первую часть, и все решение может быть даже неэффективным. Поэтому я спрашиваю, если вы знаете более эффективный способ, например, некоторую комбинацию методов DataFrame. Спасибо.

Ответы [ 2 ]

3 голосов
/ 09 марта 2020

Вы можете сделать с get_dummies и reindex, чтобы получить z значения:

df1.merge(pd.get_dummies(df2['C'])
            .reindex(list('wxyz'), axis=1, fill_value=0)
            .assign(Date=df2.Date),
          on='Date',    
          how='left'
         ).fillna(0)

Выход:

         Date   A   B    w    x    y    z
0  2020-03-01  12  15  1.0  0.0  0.0  0.0
1  2020-03-02  13  16  0.0  0.0  0.0  0.0
2  2020-03-03  14  17  0.0  1.0  0.0  0.0
0 голосов
/ 09 марта 2020

Сначала вы должны построить tmp фрейм данных, используя get_dummies после объединения df1 и df2 в Date. Используйте reindex, чтобы убедиться, что все столбцы заполнены 0:

tmp = pd.get_dummies(df1.merge(df2, 'left', on='Date')['C']).reindex(df2['C'].values,
                                                                      axis=1, fill_value=0)

. Это дает:

   x  w  y
0  0  1  0
1  0  0  0
2  1  0  0

Теперь мы можем вычислить столбец z, чтобы получить 1 если в строке нет 1, то можно указать df1:

tmp['z'] = 1 - tmp.aggregate('sum', axis=1)
resul = pd.concat([df1, tmp], axis=1)

и получить:

         Date   A   B  x  w  y  z
0  2020-03-01  12  15  0  1  0  0
1  2020-03-02  13  16  0  0  0  1
2  2020-03-03  14  17  1  0  0  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...