Cálculo de la frecuencia de las columnas de objetos DataFrameGroupBy (pandas)

Para el siguiente conjunto de datos:

Index ADR EF INF SS class type 1 1 1 0 0 SRI F 2 1 0 1 1 SRI h 3 0 1 0 0 NRI N 4 0 0 1 1 NRI u 5 1 0 1 1 NRI l 

Primero debo agrupar los datos según los valores en la columna “clase” (dos grupos: SRI, NRI) y luego calcular la frecuencia para las columnas ADR, EF, INF, SS. Este es mi código:

  print (df.groupby("class").ADR.value_counts()) print (df.groupby("class").EF.value_counts()) print (df.groupby("class").INF.value_counts()) print (df.groupby("class").SS.value_counts()) 

Pero prefiero escribirlo como una función. Cualquier sugerencia ?

Esto es un poco más desafiante, porque desea realizar esta acción en un número variable de columnas.

Primero puede usar df.groupby seguido de df.agg :

 In [1085]: df.groupby('class').agg(lambda x: [np.bincount(x)]).applymap(lambda x: x[0]) Out[1085]: ADR EF INF SS class NRI [2, 1] [2, 1] [1, 2] [1, 2] SRI [0, 2] [1, 1] [1, 1] [1, 1] 

Nuevamente, para la agregación selectiva, una función que acepte una lista de columnas hará:

 def foo(df, type, columns): return df.groupby(type)[columns].agg(lambda x: [np.bincount(x)]).applymap(lambda x: x[0]) 

O puedes probar este …

 List=[] List2=[] for names,df1 in df.groupby('class'): print(df1) List.append(df1.drop(['class','type'],axis=1).apply(pd.value_counts, axis=0)) List2.append(names) pd.concat(List,keys=List2).fillna(0) Out[110]: ADR EF INF SS NRI 0 2.0 2 1 1 1 1.0 1 2 2 SRI 0 0.0 1 1 1 1 2.0 1 1 1 
 In [135]: df.drop(['Index','type'],1) \ ...: .groupby("class") \ ...: .agg([lambda x: x.eq(0).sum(), 'sum']) \ ...: .rename(columns={'':0,'sum':1}) \ ...: .rename_axis(None) \ ...: .stack() Out[135]: ADR EF INF SS NRI 0 2 2 1 1 1 1 1 2 2 SRI 0 0 1 1 1 1 2 1 1 1 

o como un DF de varias columnas:

 In [125]: df.drop(['Index','type'],1) \ ...: .groupby("class") \ ...: .agg([lambda x: x.eq(0).sum(), 'sum']) \ ...: .rename(columns={'':0,'sum':1}) \ ...: .rename_axis(None) Out[125]: ADR EF INF SS 0 1 0 1 0 1 0 1 NRI 2 1 2 1 1 2 1 2 SRI 0 2 1 1 1 1 1 1