2015-10-07 2 views
1

Имея настоящий ум пустой прямо сейчас.Pandas: Работа с Boolean в сводной таблице

У меня есть DataFrame в формате [userid],[q1],[q2],[q3],[q4] (Каждый столбец q является dtype boolean).

q1 q2  q3 q4  userid 
0 True False True False 1 
1 True True False False 2 
2 False False True True 3 
3 True True True True 4 
4 False False True True 5 
5 True True False False 6 

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

df['q1'].value_counts() будет возвращать значения, как и ожидалось:

False 7138 
True  2768 
dtype: int64 

Я хотел бы, чтобы добраться до этого, и я совсем не могу получить там:

 q1 q2 q3 
True 600 45 700 
False 245 800 145 

Не уверен, что если мне нужно преобразовать boolean to int, или если мне не хватает преобразования или шага карты.

Любая помощь оценена!

ответ

3

IIUC вы можете просто позвонить apply и передать value_counts:

In [13]: 
df.ix[:,:'q3'].apply(pd.Series.value_counts) 

Out[13]: 
     q1 q2 q3 
True 4 3 4 
False 2 3 2 

Как @DSM указал, если у вас есть столбцы со всеми True/False тогда он будет вставить NaN для несуществующих значений в этом случае вы можете позвонить по телефону fillna(0) следующим образом:

df.ix[:,:'q3'].apply(pd.Series.value_counts).fillna(0) 
+1

'.loc'>' .ix'? И в принципе нам может понадобиться '.fillna (0)', если столбец не содержит как True, так и False. – DSM

+0

Вы также можете выбрать столбцы 'q' с помощью:' df.filter (regex = '^ q') '. (Это будет работать независимо от порядка столбцов.) – unutbu

+0

@DSM нет diff здесь, я обычно использую '.ix', когда нарезает cols лично – EdChum

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