Объедините столбцы в пандах, чтобы создать новый столбец - PullRequest
0 голосов
/ 15 октября 2019

Здравствуйте, я работаю с pandas dataframe и хочу создать столбец, объединяющий несколько столбцов и применяющий к ним условие, и я ищу разумный способ сделать это.

Предположим, что кадр данных выглядит как

A   B   C   D
1   0   0   0
0   1   0   0
0   0   1   0
1   0   1   0
1   1   1   0
0   0   1   1

Мой выходной столбец должен быть таким, как показано ниже

A   B   C   D   Output_col
1   0   0   0   A
0   1   0   0   B
0   0   1   0   C
1   0   1   0   A_C
1   1   1   0   A_B_C
0   0   1   1   C_D

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

test['Output_col'] = test.A.apply(lambda x: A if x > 0 else 0)

Мне было интересно, есть ли способ, которым я мог бы достичь этого без применения к каждому столбцу, если у меня очень большое количество столбцов.

Заранее спасибо !!

Ответы [ 2 ]

4 голосов
/ 15 октября 2019

Использование DataFrame.apply + join. Выберите имена столбцов, используя x.index ( обратите внимание, что axis = 1 используется ) + boolean indexing с Series.eq для фильтрации выбранных столбцов:

test['Output_col']=test.apply(lambda x: '_'.join(x.index[x.eq(1)]),axis=1)
print(test)

   A  B  C  D Output_col
0  1  0  0  0          A
1  0  1  0  0          B
2  0  0  1  0          C
3  1  0  1  0        A_C
4  1  1  1  0      A_B_C
5  0  0  1  1        C_D

Чтобы применить только список столбцов:

my_list_columns=['enter element of your list']
test['Output_col']=test[my_list_columns].apply(lambda x: '_'.join(x.index[x.eq(1)]),axis=1)
print(test)

регистр для всех столбцов равен 0

my_list_columns=['A','B','C','D']
df['Output_col']=df[my_list_columns].apply(lambda x: '_'.join(x.index[x.eq(1)])  if x.eq(1).any() else 'no_value',axis=1)
print(df)

   A  B  C  D Output_col
0  1  0  0  0          A
1  0  0  0  0   no_value
2  0  0  1  0          C
3  1  0  1  0        A_C
4  1  0  1  0        A_C
5  0  0  1  1        C_D
1 голос
/ 15 октября 2019

Редактировать : для подмножества столбцов (я использую метод 2)

cols = ['A', 'B']
df1 = df[cols]
s = df1.columns + '-'
df['Output_col'] = df1.dot(s).str[:-1]

Out[54]:
   A  B  C  D Output_col
0  1  0  0  0          A
1  0  1  0  0          B
2  0  0  1  0
3  1  0  1  0          A
4  1  1  1  0        A-B
5  0  0  1  1

Попробуйте эту комбинацию str.replace и dot

df['Output_col'] = df.dot(df.columns).str.replace(r'(?<!^)(?!$)','-')

Out[32]:
   A  B  C  D Output_col
0  1  0  0  0          A
1  0  1  0  0          B
2  0  0  1  0          C
3  1  0  1  0        A-C
4  1  1  1  0      A-B-C
5  0  0  1  1        C-D

Если вы чувствуете себя неловко с регулярным выражением. Вы можете попробовать этот способ без использования str.replace

s = df.columns + '-'
df['Output_col'] = df.dot(s).str[:-1]

Out[50]:
   A  B  C  D Output_col
0  1  0  0  0          A
1  0  1  0  0          B
2  0  0  1  0          C
3  1  0  1  0        A-C
4  1  1  1  0      A-B-C
5  0  0  1  1        C-D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...