猿问

如何向下迭代一列名称以使用每个名称的出现次数填充新列

我正在处理名为“公司”的数据框列(您可以在下面看到它的样子)。我想用这个专栏来创建另一个名为“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])”确实比较了公司名称. 我相信其他一切都是完全错误的。任何建议将不胜感激。


Cats萌萌
浏览 149回答 2
2回答

开心每一天1111

您不需要为此使用循环。您可以使用groupby+ cumcount:df['ocurrence']=df.groupby('company').cumcount()+1print(df)      company  ocurrence0   company 1          11   company 1          22   company 1          33   company 2          14   company 2          25   company 3          16   company 4          17   company 4          28   company 5          19   company 5          210  company 5          311  company 5          4

泛舟湖上清波郎朗

你有几个错误: for i in range(len(companies)):这应该是你唯一的循环;它将推动您的旅行下降。其他一切都将简单地使用i行索引。     while str(companies[i]) == str(companies[i+1]):使用if;您每次迭代只进行一次检查。使其成为while意味着此whiel循环中的某些内容必须更改 的值i或表中的值-否则,条件永远不会改变,并且您将进入无限循环。         if str(companies[i]) is not str(companies[i+1]):我不明白为什么会存在这种情况。首先,is not 必须为真,因为这两个对象不可能有相同的参照物:它们是同一序列中的不同位置。如果您在标签不同时尝试做某事,则取消缩进并将其替换为 simple else,指的是if您刚刚从格式不正确的while.
随时随地看视频慕课网APP

相关分类

Python
我要回答