Create column of value_counts in Pandas dataframe
df['Counts'] = df.groupby(['Color'])['Value'].transform('count')
For example,
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
Note that transform('count')
ignores NaNs. If you want to count NaNs, use transform(len)
.
To the anonymous editor: If you are getting an error while using transform('count')
it may be due to your version of Pandas being too old. The above works with pandas version 0.15 or newer.
One other option:
z = df['Color'].value_counts
z1 = z.to_dict() #converts to dictionary
df['Count_Column'] = df['Color'].map(z1)
This option will give you a column with repeated values of the counts, corresponding to the frequency of each value in the 'Color' column.
This answer uses Series.map
with Series.value_counts
. It was tested with Pandas 1.1.
df['counts'] = df['attribute'].map(df['attribute'].value_counts())
Credit: comment by sacuL
df['Counts'] = df.Color.groupby(df.Color).transform('count')
You can do this with any series: group it by itself and call transform('count')
:
>>> series = pd.Series(['Red', 'Red', 'Blue'])
>>> series.groupby(series).transform('count')
0 2
1 2
2 1
dtype: int64