在 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
拜托,有人知道我如何创建这个新数据框吗?
您可以使用 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()
你可以用 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=";")
在 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
拜托,有人知道我如何创建这个新数据框吗?
您可以使用 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()
你可以用 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=";")