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

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
Andy Hayden
fuente
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
BEN_YO
fuente
7
bonito. ¡incluso puede agregar margins=Truepara obtener los recuentos marginales!
Matt Hancock
0

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

df_solution = df.pivot_table(index=['Group','Size'], aggfunc='size')
asantz96
fuente