首页 > 解决方案 > 如何向下迭代一列名称以使用每个名称的出现次数填充新列

问题描述

我正在处理名为“公司”的数据框列(您可以在下面看到它的样子)。我想用这个专栏来创建另一个名为“occurrences”的专栏。我的目标是根据公司名称出现的次数顺序填充出现列。我希望它看起来像这样

company   |   occurrences

company 1 |   1
company 1 |   2
company 1 |   3
company 2 |   1
company 2 |   2
company 3 |   1
company 4 |   1
company 4 |   2
company 5 |   1
company 5 |   2
company 5 |   3
company 5 |   4

不幸的是,我在这样做时遇到了很多麻烦。这是我开始尝试的尝试,但首先,它创建了一个无限循环,我无法弄清楚如何摆脱它,其次,即使它有效,这也会错误地填充值。除此之外,嵌套在 while 语句中的 if 语句返回的是整个列,而不是公司的最终计数。

 def occurrences(companies):
 occurrences = []
     for i in range(len(companies)):
         x = 0
         occurrences.append(x)
         while str(companies[i]) == str(companies[i+1]):
             x = x+1
             occurrences.append(x)
             if str(companies[i]) is not str(companies[i+1]):
                 x = companies.str.count(companies[i])
                 occurrences.append(x)
     return round_number

 occurrences(companies)

我知道“for i in range(len(companies))”这一行在列中向下迭代,并且我知道“str(companies[i]) == str(companies[i+1])”确实比较了公司名称. 我相信其他一切都是完全错误的。任何建议将不胜感激。

标签: pythonpandas

解决方案


您不需要为此使用循环。您可以使用groupby+ cumcount

df['ocurrence']=df.groupby('company').cumcount()+1
print(df)

      company  ocurrence
0   company 1          1
1   company 1          2
2   company 1          3
3   company 2          1
4   company 2          2
5   company 3          1
6   company 4          1
7   company 4          2
8   company 5          1
9   company 5          2
10  company 5          3
11  company 5          4

推荐阅读