В pandas как создать фрейм данных, проиндексированный по id и со столбцами с отдельным контентом для каждого вида? - PullRequest
0 голосов
/ 22 января 2020

В Python 3 и pandas У меня есть фрейм данных:

comps.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 62679 entries, 0 to 62678
Data columns (total 39 columns):
cnpj                           62679 non-null object
razao_social                   62679 non-null object
nome_fantasia                  36573 non-null object
nome_socio                     62679 non-null object
cnpj_cpf_do_socio              62679 non-null object

Столбец (cnpj) имеет уникальные коды идентификаторов компании. И в столбцах (nome_socio) есть имена людей, связанных с компаниями, а в столбце (cnpj_cpf_do_socio) идентификационные коды этих людей

Так что код в (cnpj) может повторяться много строк, в зависимости от числа людей, связанных. Например:

cnpj            nome_socio  cnpj_cpf_do_socio 
12345678901234  Paul JR.    987654321
12345678901234  Paul SR.    987665656
12345678901234  Mary Tree   987651213
12345678901234  Paula Sims  987652328
78889098898085  Vitor Moon  558900690
78889098898085  Sheila Kerr 546656588

Другие столбцы (razao_social) и (nome_fantasia) также повторяются, это названия компаний

Поэтому я хотел бы создать новый кадр данных, который имеет только каждый код (cnpj) в каждой строке и соответствующие имена (razao_social) и (nome_fantasia). И все (nome_socio) и (cnpj_cpf_do_socio) соответствуют всем на одной строке, но разделены знаком ";"

Что-то вроде:

cnpj            razao_social    nome_fantasia   all_names                               all_ids_names
12345678901234  Company 1       Zebra           Paul JR.;Paul SR.;Mary Tree;Paula Sims  987654321;987665656;987651213;987652328
78889098898085  Company 2       All Shops       Vitor Moon;Sheila Kerr                  558900690;546656588

Пожалуйста, кто-нибудь знает, как я могу создать это новый фрейм данных?

Ответы [ 2 ]

1 голос
/ 22 января 2020

Вы можете сделать это с помощью pivot_table, примерно так:

funcs = {"razao_social": lambda x: x, "nome_fantasia": lambda x: x,
         "nome_socio": lambda x: ";".join(x), "cnpj_cpf_do_socio": lambda x: ";".join(x)}
pivot = pd.pivot_table(df, index="cnpj", aggfunc=funcs)

Затем создайте all_names:

pivot["all_names"] = pivot["nome_socio"].str.cat(pivot["cnpj_cpf_do_socio"], sep=";")
1 голос
/ 22 января 2020

Вы можете использовать groupby, agg и сделать что-то вроде:

df1 = (df
      .groupby(['cnpj','razao_social', 'nome_fantasia'])
      .agg({'nome_socio': lambda x: ';'.join(list(x)),
            'cnpj_cpf_do_socio': lambda x: ';'.join(list(map(str, x)))})
      .reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...