Объединение нескольких столбцов в один в пандах на основе логического значения - PullRequest
1 голос
/ 06 марта 2019

Как я могу объединить несколько столбцов в один столбец в пандах?

У меня есть эта таблица:

ID   | A   | B   | C | D
1      1     1     0   3
2      1     0     1   2
3      0     0     1   8

Я хочу получить эту таблицу:

ID   | X | D
1      A   3
1      B   3
2      A   2
2      C   2
3      C   8

Я хочу объединить столбцы A, B, C в столбец X на основена их значения.Если один идентификатор имеет несколько значений true (1), объединяющих столбцы (A / B / C), будет новая копия строки этого идентификатора.

Ответы [ 2 ]

3 голосов
/ 06 марта 2019

Вы можете использовать melt для изменения формы DataFrame, а затем сохранить только соответствующие столбцы и строки, используя query для выбора строк и drop для удаления устаревшего столбца, например:

(df.melt(id_vars=['ID', 'D'], var_name='X')
.query('value == 1')
.drop(columns=['value']))
#       ID  D  X
#0   1  3  A
#1   2  2  A
#3   1  3  B
#7   2  2  C
#8   3  8  C

DataFrame после расплавления выглядит следующим образом:

#   ID  D  X  value
#0   1  3  A      1
#1   2  2  A      1
#2   3  8  A      0
#3   1  3  B      1
#4   2  2  B      0
#5   3  8  B      0
#6   1  3  C      0
#7   2  2  C      1
#8   3  8  C      1

При использовании ID и D как id_vars, они дублируются для каждого другого значения всех других переменных (A, B и C).Значения этих столбцов теперь находятся в столбце value.Затем нужно сохранить строки, в которых value == 1

0 голосов
/ 06 марта 2019

Одно из возможных решений:

df2 = df.set_index('ID')
df2[['A', 'B', 'C']].multiply(df2['D'], axis='index').reset_index()\
    .melt(id_vars='ID', var_name='X', value_name='D').query('D > 0')\
    .sort_values('ID')

Результат:

   ID  X  D
0   1  A  3
3   1  B  3
1   2  A  2
7   2  C  2
8   3  C  8

По сравнению с желаемым результатом есть дополнительный (индексный) столбец, но я думаю, что это не важно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...