Pandas DataFrame Groupby dos columnas y obtener recuentos

Resuelto Nilani Algiriyage asked hace 11 años • 8 respuestas

Tengo un marco de datos de pandas en el siguiente formato:

df = pd.DataFrame([
    [1.1, 1.1, 1.1, 2.6, 2.5, 3.4,2.6,2.6,3.4,3.4,2.6,1.1,1.1,3.3], 
    list('AAABBBBABCBDDD'), 
    [1.1, 1.7, 2.5, 2.6, 3.3, 3.8,4.0,4.2,4.3,4.5,4.6,4.7,4.7,4.8], 
    ['x/y/z','x/y','x/y/z/n','x/u','x','x/u/v','x/y/z','x','x/u/v/b','-','x/y','x/y/z','x','x/u/v/w'],
    ['1','3','3','2','4','2','5','3','6','3','5','1','1','1']
]).T
df.columns = ['col1','col2','col3','col4','col5']

df:

   col1 col2 col3     col4 col5
0   1.1    A  1.1    x/y/z    1
1   1.1    A  1.7      x/y    3
2   1.1    A  2.5  x/y/z/n    3
3   2.6    B  2.6      x/u    2
4   2.5    B  3.3        x    4
5   3.4    B  3.8    x/u/v    2
6   2.6    B    4    x/y/z    5
7   2.6    A  4.2        x    3
8   3.4    B  4.3  x/u/v/b    6
9   3.4    C  4.5        -    3
10  2.6    B  4.6      x/y    5
11  1.1    D  4.7    x/y/z    1
12  1.1    D  4.7        x    1
13  3.3    D  4.8  x/u/v/w    1

Quiero obtener el recuento de cada fila como se muestra a continuación. Rendimiento esperado:

col5 col2 count
1    A      1
     D      3
2    B      2
etc...

¿Cómo obtener el resultado esperado? ¿Y quiero encontrar el recuento más grande para cada valor de 'col2'?

Nilani Algiriyage avatar Jul 16 '13 21:07 Nilani Algiriyage
Aceptado

Estás buscando size:

In [11]: df.groupby(['col5', 'col2']).size()
Out[11]:
col5  col2
1     A       1
      D       3
2     B       2
3     A       3
      C       1
4     B       1
5     B       2
6     B       1
dtype: int64

Para obtener la misma respuesta que esperandokuo (la "segunda pregunta"), pero un poco más clara, es agrupar por nivel:

In [12]: df.groupby(['col5', 'col2']).size().groupby(level=1).max()
Out[12]:
col2
A       3
B       2
C       1
D       3
dtype: int64
Andy Hayden avatar Jul 16 '2013 14:07 Andy Hayden

Seguido de la respuesta de @Andy, puedes hacer lo siguiente para resolver tu segunda pregunta:

In [56]: df.groupby(['col5','col2']).size().reset_index().groupby('col2')[[0]].max()
Out[56]: 
      0
col2   
A     3
B     2
C     1
D     3
waitingkuo avatar Jul 16 '2013 14:07 waitingkuo

Solución idiomática que utiliza solo un grupo por

(df.groupby(['col5', 'col2']).size() 
   .sort_values(ascending=False) 
   .reset_index(name='count') 
   .drop_duplicates(subset='col2'))

  col5 col2  count
0    3    A      3
1    1    D      3
2    5    B      2
6    3    C      1

Explicación

El resultado del sizemétodo groupby es una Serie con col5y col2en el índice. Desde aquí, puede utilizar otro método groupby para encontrar el valor máximo de cada valor, col2pero no es necesario hacerlo. Simplemente puede ordenar todos los valores de forma descendente y luego conservar solo las filas con la primera aparición col2con el drop_duplicatesmétodo.

Ted Petrou avatar Nov 05 '2017 19:11 Ted Petrou

Insertar datos en un marco de datos de pandas y proporcionar el nombre de la columna .

import pandas as pd
df = pd.DataFrame([['A','C','A','B','C','A','B','B','A','A'], ['ONE','TWO','ONE','ONE','ONE','TWO','ONE','TWO','ONE','THREE']]).T
df.columns = [['Alphabet','Words']]
print(df)   #printing dataframe.

Estos son nuestros datos impresos:

ingrese la descripción de la imagen aquí

Para crear un grupo de marcos de datos en pandas y contador ,
debe proporcionar una columna más que cuente la agrupación, llamemos a esa columna "CONTADOR" en el marco de datos .

Como esto:

df['COUNTER'] =1       #initially, set that counter to 1.
group_data = df.groupby(['Alphabet','Words'])['COUNTER'].sum() #sum function
print(group_data)

PRODUCCIÓN:

ingrese la descripción de la imagen aquí

The Gr8 Adakron avatar Jul 21 '2016 11:07 The Gr8 Adakron