在 pandas 中,如何创建由 id 索引的数据框,并为每个外观创建具有单独内容的列?

In pandas, how to create dataframe indexed by id and with columns with separate content for each appearance?

在 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

拜托,有人知道我如何创建这个新数据框吗?

您可以使用 groupbyagg 并执行以下操作:

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()

你可以用 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=";")