我对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
答案 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)
我最初的想法是使用列表推导,如下所示,但正如评论中指出的那样,这比groupby
和transform
方法慢。我将留下这个答案,以证明该怎么做:
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.map
与Series.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)