76

我想从我的 Pandas 数据框列之一创建唯一值的计数,然后将具有这些计数的新列添加到我的原始数据框中。我尝试了几种不同的方法。我创建了一个 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
4

6 回答 6

78
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 版本太旧。以上适用于 pandas 0.15 或更高版本。

于 2013-07-17T20:20:02.253 回答
20

另一种选择:

z = df['Color'].value_counts 

z1 = z.to_dict() #converts to dictionary

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

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

于 2018-07-08T19:02:17.540 回答
9

这个答案使用Series.mapwith Series.value_counts。它使用 Pandas 1.1 进行了测试。

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

信用:sacuL评论

于 2020-08-04T21:04:28.060 回答
4

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
于 2018-06-30T21:50:48.977 回答
3

我最初的想法是使用如下所示的列表理解,但正如评论中所指出的,这比groupbyandtransform方法慢。我将留下这个答案来演示不该做什么

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]

@unutbu 的方法对于具有几列的 DataFrame 变得复杂,这使得编码更简单。如果您使用的是小数据框,这会更快(见下文),但否则,您应该使用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
于 2015-05-15T02:29:42.980 回答
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) 
于 2021-07-11T22:12:07.160 回答