Obtenga un recuento de frecuencia basado en múltiples columnas de marco de datos

Resuelto emax asked hace 8 años • 3 respuestas

Tengo el siguiente marco de datos.

Grupo Tamaño
Corto Pequeño
Corto Pequeño
Moderado Medio
Moderado Pequeño
Alto Grande

Quiero contar la frecuencia de cuántas veces aparece la misma fila en el marco de datos.

Group           Size      Time
Short          Small        2
Moderate       Medium       1 
Moderate       Small        1
Tall           Large        1
emax avatar Oct 22 '15 06:10 emax
Aceptado

Puedes usar groupbysize

import pandas as pd

# load the sample data
data = {'Group': ['Short', 'Short', 'Moderate', 'Moderate', 'Tall'], 'Size': ['Small', 'Small', 'Medium', 'Small', 'Large']}
df = pd.DataFrame(data)

Opción 1:

dfg = df.groupby(by=["Group", "Size"]).size()

# which results in a pandas.core.series.Series
Group     Size
Moderate  Medium    1
          Small     1
Short     Small     2
Tall      Large     1
dtype: int64

Opcion 2:

dfg = df.groupby(by=["Group", "Size"]).size().reset_index(name="Time")

# which results in a pandas.core.frame.DataFrame
      Group    Size  Time
0  Moderate  Medium     1
1  Moderate   Small     1
2     Short   Small     2
3      Tall   Large     1

Opción 3:

dfg = df.groupby(by=["Group", "Size"], as_index=False).size()

# which results in a pandas.core.frame.DataFrame
      Group    Size  Time
0  Moderate  Medium     1
1  Moderate   Small     1
2     Short   Small     2
3      Tall   Large     1
Andy Hayden avatar Oct 22 '2015 00:10 Andy Hayden

La actualización después de pandas 1.1value_countsahora acepta múltiples columnas

df.value_counts(["Group", "Size"])

También puedes probarpd.crosstab()

Group           Size

Short          Small
Short          Small
Moderate       Medium
Moderate       Small
Tall           Large

pd.crosstab(df.Group,df.Size)


Size      Large  Medium  Small
Group                         
Moderate      0       1      1
Short         0       0      2
Tall          1       0      0

EDITAR: Para obtener su resultado

pd.crosstab(df.Group,df.Size).replace(0,np.nan).\
     stack().reset_index().rename(columns={0:'Time'})
Out[591]: 
      Group    Size  Time
0  Moderate  Medium   1.0
1  Moderate   Small   1.0
2     Short   Small   2.0
3      Tall   Large   1.0
BENY avatar May 05 '2017 21:05 BENY

Otra posibilidad es utilizar .pivot_table()yaggfunc='size'

df_solution = df.pivot_table(index=['Group','Size'], aggfunc='size')
asantz96 avatar Aug 06 '2020 17:08 asantz96