2016-10-12 3 views
0

Я ДФPython Pandas: группировать и подсчитывать отдельное значение по всем столбцам?

 column1 column2 column3 column4 
0 name  True  True   NaN 
1 name  NaN  True   NaN 
2 name1  NaN  True   True 
3 name1  True  True  True 

, и я хотел бы Группу и рассчитывать определенное значение по всему columnsI пытается:

df.groupby('column1').nunique() 

, но я получаю эту ошибку.

AttributeError: 'DataFrameGroupBy' object has no attribute 'nunique'

У кого-нибудь есть предложение?

ответ

2

Вы можете использовать stack для Series, а затем Series.groupby с SeriesGroupBy.nunique:

df1 = df.set_index('column1').stack() 

print (df1.groupby(level=[0,1]).nunique(dropna=False).unstack()) 

Пример:

print (df) 
    column1 column2 column3 column4 
0 name True True  NaN 
1 name  NaN True  NaN 
2 name1  NaN True True 
3 name1 True True True 

df1 = df.set_index('column1').stack(dropna=False) 
print (df1) 
column1   
name  column2 True 
     column3 True 
     column4  NaN 
     column2  NaN 
     column3 True 
     column4  NaN 
name1 column2  NaN 
     column3 True 
     column4 True 
     column2 True 
     column3 True 
     column4 True 
dtype: object 

print (df1.groupby(level=[0,1]).nunique(dropna=False).unstack(fill_value=0)) 
     column2 column3 column4 
column1       
name   2  1  1 
name1   2  1  1 

print (df1.groupby(level=[0,1]).nunique().unstack(fill_value=0)) 
     column2 column3 column4 
column1       
name   1  1  0 
name1   1  1  1 

Другое решение с двойным apply:

print (df.groupby('column1') 
     .apply(lambda x: x.iloc[:,1:].apply(lambda y: y.nunique(dropna=False)))) 
     column2 column3 column4 
column1       
name   2  1  1 
name1   2  1  1 

print (df.groupby('column1').apply(lambda x: x.iloc[:,1:].apply(lambda y: y.nunique()))) 
     column2 column3 column4 
column1       
name   1  1  0 
name1   1  1  1 
+0

Это только дает мне счет первого столбца. Мне нужны уникальные подсчеты всех столбцов – UserYmY

+0

Извините, я плохо это понимаю. Но теперь я думаю, что это правильно - я добавляю 'groupby' по уровню' index' 'Series'. – jezrael

+0

Да, с исправлением он работает только в том, что мне нужно отстегнуть его, чтобы получить правильный фрейм данных. – UserYmY

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