gpt4 book ai didi

python - 在 Pandas 中,如何根据列中用逗号分隔的项目计数创建数据框?

转载 作者:行者123 更新时间:2023-11-28 22:16:50 25 4
gpt4 key购买 nike

在 python3 和 pandas 中,我有一个数据框,其中包含有关法律程序的每一行信息。

“nome”列是人名,“tipo”列是诉讼类型,只有INQAP两种类型。

“简历”一栏包含在法庭程序中调查起诉的罪行。但每个法律程序都可能包含一项或多项罪行。犯罪之间用“,”分隔:

Peculato,           Lavagem de Dinheiro
Corrupção passiva, Ocultação de bens, Lavagem de dinheiro
Corrupção passiva, Lavagem de dinheiro, Crimes Eleitorais
Crimes Eleitorais, Lavagem de dinheiro
Peculato
Quadrilha ou Bando, Crimes da Lei de licitações, Peculato

我需要数数:

For each name
Divided by INQ and AP processes
The appearance of each individual crime between ","

以“简历”列上方的示例为例,假设它们都与“John Doe”有关。

前两行的类型是AP,剩下的是INQ,那么John Doe有:

1 AP for Peculato
2 AP for Lavagem de dinheiro
1 AP for Corrupção passiva
1 AP for Ocultação de bens

1 INQ for Corrupção passiva
2 INQ for Lavagem de dinheiro
2 INQ for Crimes Eleitorais
2 INQ for Peculato
1 INQ for Quadrilha ou Bando
1 INQ for Crimes da Lei de licitações

行的样本看起来像

df_selecao_atual[['tipo', 'resumo', 'nome']].head(5).to_dict()
{'tipo': {2: 'INQ', 3: 'AP', 4: 'INQ', 5: 'INQ', 6: 'AP'},
'resumo': {2: 'Desvio de verbas públicas',
3: 'Desvio de verbas públicas',
4: nan,
5: 'Prestação de contas rejeitada',
6: 'Peculato, Gestão fraudulenta'},
'nome': {2: 'CÉSAR MESSIAS',
3: 'CÉSAR MESSIAS',
4: 'FLAVIANO MELO',
5: 'FLAVIANO MELO',
6: 'FLAVIANO MELO'}}

在这个数据库上,我已经在这个链接中得到了一个非常有效的答案:In pandas, how to count items between commas, dividing between column types?

但现在我不仅需要在屏幕上显示,还需要创建一个数据框。像这样:

nome                tipo    resumo              count
Fulano de tal INQ Peculato 4
Fulano de tal INQ Ocultação de Bens 1
Fulano de tal INQ Corrupção ativa 2
Fulano de tal INQ Investigação Penal 3
Fulano de tal AP Peculato 1
Fulano de tal AP Corrupção passiva 2
Beltrano da Silva INQ Peculato 2
Beltrano da Silva INQ Lavagem de dinheiro 5
Beltrano da Silva AP Lavagem de dinheiro 1

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

最佳答案

您可以通过split 创建另一个DataFrame resumo 列并添加到原始 join ,然后使用 groupbysize 进行计数:

s = (df.pop('resumo').str.split(',', expand=True)
.stack()
.reset_index(level=1, drop=True)
.rename('resumo'))


df = df.join(s).groupby(['nome','tipo','resumo']).size().reset_index(name='count')
print (df)
nome tipo resumo count
0 CÉSAR MESSIAS AP Desvio de verbas públicas 1
1 CÉSAR MESSIAS INQ Desvio de verbas públicas 1
2 FLAVIANO MELO AP Gestão fraudulenta 1
3 FLAVIANO MELO AP Peculato 1
4 FLAVIANO MELO INQ Prestação de contas rejeitada 1

如果想将 Counter 解决方案与上一个解决方案一起使用:

s = df.dropna().groupby(['nome', 'tipo']).resumo.agg(', '.join).str.split(', ').agg(Counter)
print (s)
nome tipo
CÉSAR MESSIAS AP {'Desvio de verbas públicas': 1}
INQ {'Desvio de verbas públicas': 1}
FLAVIANO MELO AP {'Peculato': 1, 'Gestão fraudulenta': 1}
INQ {'Prestação de contas rejeitada': 1}
Name: resumo, dtype: object

df2 = (pd.DataFrame(s.values.tolist(), index=s.index)
.stack()
.astype(int)
.reset_index(name='count')
.rename(columns={'level_2':'resumo'}))
print (df2)
nome tipo resumo count
0 CÉSAR MESSIAS AP Desvio de verbas públicas 1
1 CÉSAR MESSIAS INQ Desvio de verbas públicas 1
2 FLAVIANO MELO AP Gestão fraudulenta 1
3 FLAVIANO MELO AP Peculato 1
4 FLAVIANO MELO INQ Prestação de contas rejeitada 1

关于python - 在 Pandas 中,如何根据列中用逗号分隔的项目计数创建数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51896621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com