Как перебрать столбец имен, чтобы заполнить новый столбец количеством вхождений каждого имени - PullRequest
0 голосов
/ 19 октября 2019

Я работаю со столбцом данных, который называется «компании» (вы можете увидеть, как он выглядит ниже). Я хотел бы использовать этот столбец для создания другого столбца под названием «вхождения». Моя цель - заполнить столбец вхождений последовательно, исходя из того, сколько раз встречается название компании. Я хочу, чтобы это выглядело так:

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, вложенный в оператор while, возвращает весь столбец вместо окончательного числа компаний.

 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)

Я знаю строку «для i в диапазоне (len (companies))» »перебираем столбец, и я знаю, что "str (companies [i]) == str (companies [i + 1])" действительно правильно сравнивает названия компаний. Я верю, что все остальное совершенно неправильно, хотя. Любой совет будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Вам не нужно использовать цикл для этого. Вы можете использовать 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
0 голосов
/ 19 октября 2019

У вас есть всего несколько ошибок:

 for i in range(len(companies)):

Это должен быть ваш единственный цикл;это сведет ваше путешествие вниз по колонне. Все остальное будет просто использовать строчный индекс i.

     while str(companies[i]) == str(companies[i+1]):

Use if;Вы делаете эту проверку только один раз за итерацию. Делая это while означает, что что-то в этом цикле whiel должно изменить значение i или значения в вашей таблице - в противном случае условие никогда не изменится, и у вас будет бесконечный цикл.

         if str(companies[i]) is not str(companies[i+1]):

Я не понимаю, почему это существует. Во-первых, is not должно быть истинным, поскольку два объекта не могут иметь один и тот же референт: они находятся в разных местах в одной и той же последовательности. Если вы пытаетесь что-то сделать, когда метки разные, отмените отступ и замените его на простой else, ссылаясь на if, который вы только что сделали из плохо сформированного while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...