在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=";")