2015-08-20 2 views
1

У меня есть фрейм данных в пандах с записями 0 или 1. Я хотел бы свести это к одному списку строк, которые являются результатом имени совпадающих столбцов везде, где есть 1.Pandas map 0/1 записи кадра данных в имена столбцов

для примера предположим, игрушечный мой фрейм данных

V1 V2 V3 
    0 1 1 
    1 1 0 
    0 0 0 

Я хотел бы иметь конечный результат, который выглядит как

"V2,V3" 
"V1,V2" 
"" 

Я имел initiall у пытался использовать что-то вдоль линий

my_df.apply(lambda x: colnames[x]) 

думая, что это будет вести себя так же, как NumPy обрабатывает булевы индексы. Но я не добился того, что хотел. Как мне лучше всего это сделать?

ответ

1

преобразовать DTYPE ФР к bool, а затем вызвать apply и использовать булеву маску, чтобы скрыть столбцы, вам нужно передать из параметров axis=1 для apply маски колонки построчно:

In [47]: 
df.astype(bool).apply(lambda x: ','.join(df.columns[x]), axis=1) 

Out[47]: 
0 V2,V3 
1 V1,V2 
2   
dtype: object 

Ваш код my_df.apply(lambda x: colnames[x]) не будет работать, потому что, во-первых, при вызове apply на df без указания axis вызовет лямбда по каждому столбцу в свою очередь, во-вторых, 1/0 будет интерпретировать это как значение индекса, а не булевский флаг.

+0

или вы можете 'df.apply (lambda x: '"% s "'% (','. Join (df.columns [x == 1])), axis = 1)' –

Смежные вопросы