Соответствие строк и частота подсчета - PullRequest
2 голосов
/ 14 июля 2020

У меня есть список компаний с их дочерними предприятиями, данные выглядят следующим образом:

CompanyName            Employees
Microsoft China          1
Microsoft India          1
Microsoft Europe         1
Apple Inc                1
Apple Data Inc           1
Apple Customer Service Inc   1
Data Corp                1
Data SHCH                1
Data India               1
City Corp                1
Data City                 1

Если две компании используют одинаковые слова (например, Apple In c и Apple Data In c), они считаются одной компанией. Я сгруппирую эти компании вместе и подсчитаю их общее количество сотрудников.

The expected return should be:
Company     Employees
Microsft     3
Apple        3
Data         3
City         2 
  1. Компания вернет общее слово
  2. Сотрудники вернут сумму компании и ее дочерних компаний

Большая часть функции pandas в этом случае не работает. Любые предложения по L oop?

Ответы [ 3 ]

1 голос
/ 14 июля 2020
  • Как вы просили в комментариях
    • Если компания всегда является первым словом в CompanyName
# extract company as word at index 0
df.CompanyName = df.CompanyName.str.split(expand=True)[0]

# groupby company name and count
dfg = df.groupby('CompanyName').agg({'CompanyName': 'count'})

# display(dfg)
             CompanyName
CompanyName             
Apple                  3
City                   1
Data                   4
Microsoft              3
0 голосов
/ 14 июля 2020

Вы можете сделать это, используя аксессор .str, split и value_counts, например:

df['CompanyName'].str.split(' ').str[0].value_counts()

Вывод:

Data         4
Apple        3
Microsoft    3
City         1
Name: CompanyName, dtype: int64

И чтобы привести его в порядок с переименованием :

df['CompanyName'].str.split(' ').str[0].value_counts()\
                 .rename_axis('Company')\
                 .rename('count')\
                 .reset_index()

Вывод:

     Company  count
0       Data      4
1      Apple      3
2  Microsoft      3
3       City      1
0 голосов
/ 14 июля 2020

Я не думаю, что существует «очень» простой способ делать то, что вы хотите. Но это тоже не слишком сложно.

Во-первых, вам нужно четко определить критерий ~, чтобы решить, какие имена принадлежат одной и той же «компании». Мы можем попробовать «получить первый мир и посмотреть, совпадает ли он», очевидно, это не идеальный подход, но пока он подойдет.

Затем вы можете создать объект для хранения ваших новых данных. Я бы порекомендовал словарь с такими записями, как company: (total employees).

Теперь вы будете перебирать строки фрейма данных с помощью apply и функции, чтобы делать то, что вы хотите. Это будет выглядеть так:

dict = {}

def aggregator(row):
    word1 = row.company.split(" ")[0]
    
    if word1 in dict.keys:
       dict[word1] += row.employees

    else:
        dict[word1] = row.employees

dataframe.apply(aggregator, axis = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...