Pandas:逐步计算列中的出现次数

18

我有一个包含“Name”列的DataFrame(df)。在名为“Occ_Number”的列中,我希望对“Name”中每个值出现的次数进行累加。

例如:

Name            Occ_Number
 abc                     1
 def                     1
 ghi                     1
 abc                     2
 abc                     3
 def                     2
 jkl                     1
 jkl                     2

我一直在尝试想出一种方法,使用

>df['Name'].value_counts()

但是我不太清楚如何将它们全部联系起来。我只能从value_counts()中获得总计数。迄今为止,我的过程包括使用以下代码创建一个包含名称列字符串值的列表,这些值包含大于1的计数:

>things = df['Name'].value_counts()
>things = things[things > 1]
>queries = things.index.values
我希望能够通过查询“Name”并有条件地增加Occ_Number,但我卡在这里了。请问有什么方法可以做到这一点吗?任何帮助都将不胜感激。谢谢!
2个回答

30
你可以使用 cumcount 函数来避免创建虚拟列:
>>> df["Occ_Number"] = df.groupby("Name").cumcount()+1
>>> df
  Name  Occ_Number
0  abc           1
1  def           1
2  ghi           1
3  abc           2
4  abc           3
5  def           2
6  jkl           1
7  jkl           2

5
您可以添加一个辅助列,然后使用cumsum函数:
df =pd.DataFrame({'Name':['abc', 'def', 'ghi', 'abc', 'abc', 'def', 'jkl', 'jkl']})

增加计数:

df['counts'] =1

按名称分组:
cs =df.groupby('Name')['counts'].cumsum()
# set series name
cs.name = 'Occ_number'

将系列(Series)合并回数据框(DataFrame):

# remove helper column
del df['counts']
df.join(cs)

返回:

    Name    Occ_number
 0  abc     1
 1  def     1
 2  ghi     1
 3  abc     2
 4  abc     3
 5  def     2
 6  jkl     1
 7  jkl     2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接