Панды выбрать на нескольких столбцах, а затем заменить - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь выбрать несколько столбцов, затем заменить в пандах

ДФ:

a  b  c  d  e
0  1  1  0  none
0  0  0  1  none
1  0  0  0  none
0  0  0  0  none

выберите, где любой или все из a, b, c, d отличны от нуля

i, j = np.where(df)
s=pd.Series(dict(zip(zip(i, j), 
  df.columns[j]))).reset_index(-1, drop=True)

s

0   b
0   c
1   d
2   a

Теперь я хочу заменить значения в столбце e на серию:

df['e'] = s.values

так что e выглядит так:

е:

b, c 
d
a
none

Но проблема в том, что длины серий отличаются от количества строк в кадре данных.

Есть идеи, как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Вы можете найти единицы и использовать их расположение в качестве логических индексов в столбцах данных:

df['e'] = (df==1).apply(lambda x: df.columns[x], axis=1)\
                 .str.join(",").replace('','none')
#   a  b  c  d     e
#0  0  1  1  0   b,c
#1  0  0  0  1     d
#2  1  0  0  0     a
#3  0  0  0  0  none   
0 голосов
/ 11 ноября 2018

Используйте DataFrame.dot для продукта с именами столбцов, добавьте rstrip, последнее добавление numpy.where для замены пустых строк на None:

e = df.dot(df.columns + ', ').str.rstrip(', ')
df['e'] = np.where(e.astype(bool), e, None)
print (df)
   a  b  c  d     e
0  0  1  1  0  b, c
1  0  0  0  1     d
2  1  0  0  0     a
3  0  0  0  0  None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...