我想在我的pandas数据帧中创建一个value_counts列

时间:2013-07-17 20:08:43

标签: python merge pandas

我对R更熟悉,但我想知道是否有办法在熊猫中做到这一点。我想从我的一个dataframe列创建唯一值的计数,然后将包含这些计数的新列添加到我的原始数据框中。我尝试过几种不同的东西。我创建了一个pandas系列,然后使用value_counts方法计算计数。我试图将这些值合并回原始数据帧,但我要合并的键是在索引(ix / loc)中。任何建议或解决方案将不胜感激

Color Value
Red   100
Red   150
Blue  50

我希望返回类似

的内容
Color Value Counts
Red   100   2
Red   150   2 
Blue  50    1

6 个答案:

答案 0 :(得分:47)

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

例如,

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

请注意,transform('count')会忽略NaN。如果要计算NaN,请使用transform(len)


匿名编辑:如果您在使用transform('count')时收到错误,可能是因为您的Pandas版本太旧了。以上版本适用于熊猫版本0.15或更新版本。

答案 1 :(得分:5)

另一个选择:

    z = df['Color'].value_counts 

    z1 = z.to_dict() #converts to dictionary

    df['Count_Column'] = df['Color'].map(z1) 

此选项将为您提供一列重复计数值,与“颜色”列中每个值的频率相对应。

答案 2 :(得分:2)

我最初的想法是使用列表推导,如下所示,但正如评论中指出的那样,这比groupbytransform方法慢。我将留下这个答案,以证明该怎么做

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]
对于具有多个列的DataFrame,@ unutbu的方法变得复杂,这使得编码变得更加简单。如果您使用的是小型数据框,则速度更快(见下文),但除此之外,您应该使用 NOT 来使用它。

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

答案 3 :(得分:2)

此答案将Series.mapSeries.value_counts一起使用。已通过Pandas 1.1进行了测试。

df['counts'] = df['attribute'].map(df['attribute'].value_counts())

信用:comment,由 sacuL

答案 4 :(得分:1)

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

您可以使用任何系列进行此操作:将其单独分组并调用transform('count')

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

答案 5 :(得分:0)

创建一个包含重复值计数的列。这些值是从其他列计算的临时计算。非常快。归功于@ZakS。

sum_A_B = df['A']+df['B']
sum_A_B_dict = sum_A_B.value_counts().to_dict()
df['sum_A_B'] = sum_A_B.map(sum_A_B_dict)