2016-12-22 2 views
2

Вот мой dataframe:Панды - группа каждая колонка сама по себе

col1 col2 col3 col4 
0 True False True True 
1 True True False False 
2 False False True False 
3 True True False True 

Есть ли способ, чтобы сгруппировать мои данные, так что я получаю что-то вроде следующего, где цифры в таблице счетчики вхождений:

 col2   col3  col4 
     True False True False True False 
col1   
True 2 1  x x  x x 
False 0 1  x x  x x 

Большое спасибо за помощь!

ответ

2

Установить col1 как ось индекса. Выполните операцию stack, чтобы изменить ее на длинный форматированный объект серии.

Групповые уровни 0 и 1 серии multiindex производят и вычисляют их соответствующие значения. Затем unstack и сортировать как индексы строки и столбцы, при необходимости заполнения NaNs с 0.

(df.set_index('col1').stack().groupby(level=[0,1]).value_counts().unstack(level=[1,2]) 
    .sort_index(ascending=False, axis=1).sort_index(ascending=False).fillna(0).astype(int)) 

enter image description here

более упрощен раствором на комментарий по @jezrael:

(df.set_index('col1').stack().groupby(level=[0,1]).value_counts() 
    .sort_index(ascending=[False, True, False]).unstack([1,2]).fillna(0).astype(int)) 

enter image description here

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

+1

Я удаляю комментарий, потому что 'True'' False' является swap в индексе, извините; ( – jezrael

+1

И приятное решение, +1 – jezrael

+1

Это идеальное решение, большое вам спасибо! –

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