Python: obtenga un recuento de frecuencia basado en dos columnas (variables) en pandas dataframe, algunas filas aparecen


93

Hola, tengo el siguiente marco de datos.

    Group           Size

    Short          Small
    Short          Small
    Moderate       Medium
    Moderate       Small
    Tall           Large

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

1
jpp

Respuestas:


145

Puedes usar groupby's size:

In [11]: df.groupby(["Group", "Size"]).size()
Out[11]:
Group     Size
Moderate  Medium    1
          Small     1
Short     Small     2
Tall      Large     1
dtype: int64

In [12]: df.groupby(["Group", "Size"]).size().reset_index(name="Time")
Out[12]:
      Group    Size  Time
0  Moderate  Medium     1
1  Moderate   Small     1
2     Short   Small     2
3      Tall   Large     1

7
Gracias. Una pequeña adición para elegir los k (= 20) valores principales basados ​​en la frecuencia ("Tiempo"): df.groupby (["Grupo", "Tamaño"]). Tamaño (). Reset_index (nombre = "Tiempo") .sort_values ​​(por = 'Tiempo', ascendente = Falso) .head (20);
Dileep Kumar Patchigolla

1
Solo .size()tenga en cuenta que el uso de will devuelve Series mientras que .size().reset_index(name="Time")es un DataFrame. Gracias Andy.
alemol

o también puede hacerlo df.groupby(by=["Group", "Size"], as_index=False).size()simplemente
Naveen Kumar

51

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

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

También puedes probar pd.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 sacar tu salida

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

7
bonito. ¡incluso puede agregar margins=Truepara obtener los recuentos marginales!
Matt Hancock

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.