在Pandas Dataframe 中创建value_counts列

jhkqcmku  于 2023-02-27  发布在  其他
关注(0)|答案(8)|浏览(165)

我想从我的一个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
628mspwn

628mspwn1#

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')忽略NaNs。如果要计算NaNs,请使用transform(len)
致匿名编辑:如果您在使用transform('count')时遇到错误,可能是因为您的Pandas版本太旧。以上程序适用于Pandas 0.15或更新版本。

2admgd59

2admgd592#

另一个选择:

z = df['Color'].value_counts 

z1 = z.to_dict() #converts to dictionary

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

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

gc0ot86w

gc0ot86w3#

这个答案使用Series.mapSeries.value_counts。它是用Pandas 1.1测试的。

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

贷方:comment,通过 sacuL

ruyhziif

ruyhziif4#

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
t2a7ltrp

t2a7ltrp5#

我最初的想法是使用列表解析,如下所示,但正如评论中指出的,这比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]

@unutbu的方法对于具有多个列的DataFrames来说变得复杂,这使得编写代码变得简单。如果您正在处理一个小 Dataframe ,这会更快(见下文),但否则,您应该使用而不是use this。

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
omjgkv6w

omjgkv6w6#

创建一个包含重复值计数的列。这些值是从其他列计算出来的临时计算。非常快。归功于@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)
bqucvtff

bqucvtff7#

虽然已经有很多伟大的答案在这里,我个人认为使用:
(给定 Dataframe = df)

df['new_value_col'] = df.groupby('colname_to_count')['colname_to_count'].transform('count')

是最好和最直接的选择之一。。我想提供另一种方法,我已经成功地使用。

import pandas as pd
import numpy as np

df['new_value_col'] = df.apply(lambda row: np.sum(df['col_to_count'] == row['col_to_count'], axis=1)

这里我们实际上是把要计数的列转换为lambda表达式中的一个序列,然后使用np.sum来计数序列中每个值的出现次数。
认为这可能是有用的,从来没有坏有多个选择!

dba5bblo

dba5bblo8#

使用nunique命令沿着dropna来减少NaN值。也在谷歌协作中测试了这个。

df = pd.DataFrame({'Color': ['Red', 'Red', 'Blue'], 'Value': [100, 150, 50]})
    total_counts = df.groupby('Color')['Value'].nunique(dropna=True)
    df['Counts'] = df['Color'].transform(lambda x: total_counts[x])
    print(df)

有关nuniqueRead this blog.输出的更多了解:

相关问题