2016-11-27 3 views
4

мне нужна помощь с кратким и прежде всего эффективной формулировки в панд следующей операции:Как эффективно переупорядочить данные pandas следующим образом?

Учитывая кадр данных формата

id a b c d 
1  0 -1 1 1 
42 0 1 0 0 
128 1 -1 0 1 

Построить кадр данных формата:

id  one_entries 
1  "c d" 
42  "b" 
128 "a d" 

То есть, колонка «one_entries» содержит сцепленные имена столбцов, для которых вступление в исходном кадре 1.

ответ

5

Вот один из способов использования логического правила и применения функции лямбда.

In [58]: df 
Out[58]: 
    id a b c d 
0 1 0 -1 1 1 
1 42 0 1 0 0 
2 128 1 -1 0 1 

In [59]: cols = list('abcd') 

In [60]: (df[cols] > 0).apply(lambda x: ' '.join(x[x].index), axis=1) 
Out[60]: 
0 c d 
1  b 
2 a d 
dtype: object 

Вы можете присвоить результат df['one_entries'] =

Детали применяются FUNC.

Возьмите первый ряд.

In [83]: x = df[cols].ix[0] > 0 

In [84]: x 
Out[84]: 
a False 
b False 
c  True 
d  True 
Name: 0, dtype: bool 

x дает логические значения для строки, значения больше нуля. x[x] вернется только True. По существу серия с именами столбцов в качестве индекса.

In [85]: x[x] 
Out[85]: 
c True 
d True 
Name: 0, dtype: bool 

x[x].index дает имена столбцов.

In [86]: x[x].index 
Out[86]: Index([u'c', u'd'], dtype='object') 
+1

Вы можете объяснить 'x [x] .index'? – clstaudt

+0

Обновлено. Надеюсь, это поможет. – Zero

2

То же рассуждение, как Джон Галт, но немного короче, строительство нового DataFrame от Dict.

pd.DataFrame({ 
    'one_entries': (test_df > 0).apply(lambda x: ' '.join(x[x].index), axis=1) 
}) 

#  one_entries 
# 1   c d 
# 42    b 
# 128   a d 
Смежные вопросы