Quiero crear una columna de value_counts en mi dataframe de pandas

Estoy más familiarizado con R pero quería ver si había una manera de hacer esto en los pandas. Quiero crear una cuenta de valores únicos de una de mis columnas de dataframe y luego agregar una nueva columna con esas cuentas a mi dataframe original. He intentado un par de cosas diferentes. Creé una serie de pandas y luego calculé los conteos con el método value_counts. Intenté fusionar estos valores con mi dataframe original, pero las claves que deseo combinar están en el Índice (ix / loc). Cualquier sugerencia o solución sería apreciada.

Color Value Red 100 Red 150 Blue 50 

y queria devolver algo asi

 Color Value Counts Red 100 2 Red 150 2 Blue 50 1 

Related of "Quiero crear una columna de value_counts en mi dataframe de pandas"

 df['Counts'] = df.groupby(['Color'])['Value'].transform('count') 

Por ejemplo,

 In [102]: df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}) In [103]: df Out[103]: Color Value 0 Red 100 1 Red 150 2 Blue 50 In [104]: df['Counts'] = df.groupby(['Color'])['Value'].transform('count') In [105]: df Out[105]: Color Value Counts 0 Red 100 2 1 Red 150 2 2 Blue 50 1 

Tenga en cuenta que la transform('count') ignora los NaN. Si quieres contar NaNs, usa transform(len) .


Al editor anónimo: si se produce un error al utilizar transform('count') es posible que su versión de Pandas sea demasiado antigua. Lo anterior funciona con pandas versión 0.15 o más reciente.

Mi idea inicial sería utilizar la comprensión de lista como se muestra a continuación, pero, como se señaló en el comentario, esto es más lento que el método de groupby y transform . Dejaré esta respuesta para demostrar LO QUE NO HACER :

 In [94]: df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}) In [95]: df['Counts'] = [sum(df['Color'] == df['Color'][i]) for i in xrange(len(df))] In [96]: df Out[100]: Color Value Counts 0 Red 100 2 1 Red 150 2 2 Blue 50 1 [3 rows x 3 columns] 

El método de @unutbu se complica para DataFrames con varias columnas que simplifican el código. Si está trabajando con un dataframe pequeño, esto es más rápido (vea a continuación), pero de lo contrario, NO debe usar esto.

 In [97]: %timeit df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}); df['Counts'] = df.groupby(['Color']).transform('count') 100 loops, best of 3: 2.87 ms per loop In [98]: %timeit df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}); df['Counts'] = [sum(df['Color'] == df['Color'][i]) for i in xrange(len(df))] 1000 loops, best of 3: 1.03 ms per loop 

Otra opción:

  z = df['Color'].value_counts z1 = z.to_dict() #converts to dictionary df['Count_Column'] = df['Color'].map(z1) 

Esta opción le dará una columna con valores repetidos de los conteos, correspondientes a la frecuencia de cada valor en la columna “Color”.

df['Counts'] = df.Color.groupby(df.Color).transform('count')

Puede hacer esto con cualquier serie: agruparlo por sí mismo y llamar a la transform('count') :

 >>> series = pd.Series(['Red', 'Red', 'Blue']) >>> series.groupby(series).transform('count') 0 2 1 2 2 1 dtype: int64