在熊猫中,如何在逗号之间计算项目,如何在列类型之间划分?



在python3和pandas中,我有这个数据帧:

df_selecao_atual.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 340 entries, 2 to 678
Data columns (total 26 columns):
cpf                                339 non-null object
nome                               340 non-null object
nome_completo                      340 non-null object
partido                            339 non-null object
uf                                 339 non-null object
cargo_parlamentar                  340 non-null object
tipo                               340 non-null object
classe                             340 non-null object
numero                             340 non-null object
único                              340 non-null object
assunto                            340 non-null object
data_inicial                       340 non-null object
data_final                         340 non-null object
andamento                          340 non-null object
link                               340 non-null object
transparencia                      339 non-null object
conferencia                        339 non-null object
data_conferencia                   339 non-null object
resumo                             332 non-null object
observacao                         311 non-null object
link_noticia_tribunal_confiavel    104 non-null object
interessa                          337 non-null object
ministro_relator                   339 non-null object
processo_conectado                 44 non-null object
situacao                           337 non-null object
cadastro_push                      337 non-null object
dtypes: object(26)
memory usage: 71.7+ KB

此数据帧的每一行都有有关法律程序的信息,每行一个法庭案件

"nome"列有人名,例如:

FULANO DE TAL
BELTRANO DA SILVA
SICRANO APARECIDO
NINGUEM AUGUSTO

"tipo"一栏有诉讼类型,只有两种类型:

INQ
AP

而"简历"一栏则在法庭诉讼中调查了起诉的罪行。但每个法律程序都可能犯有一项或多项罪行。犯罪之间用",":

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

我需要数数:

  • 在每个名称中

  • 按 INQ 和 AP 进程划分

  • 每个单独犯罪的出现介于"、"之间

以"resumo"列上方的示例为例,如下所示:

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

所有这些都是针对"约翰·多伊"这个人的诉讼。前两行的类型为"AP",其余为"INQ">

然后约翰·多伊有:

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.pivot_table(index=['nome', 'tipo', 'resumo'],aggfunc='size').reset_index()

拜托,有谁知道我该怎么做?

-/-

行的示例如下所示

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'}}

使用示例数据,可以按', '聚合,然后使用Counter

df2 = df.dropna().groupby(['nome', 'tipo']).resumo.agg(', '.join).str.split(', ').agg(Counter).reset_index()

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, 'Desv...
INQ                  {'Prestação de contas rejeitada': 1}
Name: resumo, dtype: object

现在,按照您想要的方式格式化此信息变得更加容易。例如

df2 = df.dropna().groupby(['nome', 'tipo']).resumo.agg(', '.join).str.split(', ').agg(Counter).reset_index()
for _, g in df2.groupby('nome'):
x = f'{_} has: '
a = [f'{v} {t} for {k}' for d,t in zip(g.resumo, g.tipo) for (k, v) in d.items()]
lines = x + 'n'.join(a)
print(lines)

这产生

CÉSAR MESSIAS has: 
1 AP for Desvio de verbas públicas
1 INQ for Desvio de verbas públicas
FLAVIANO MELO has: 
1 AP for Peculato
1 AP for Gestão fraudulenta
1 AP for Desvio de Verbas públicas
1 AP for Prestação de contas rejeitada
1 INQ for Prestação de contas rejeitada

在使用透视、分组依据或聚合函数获取汇总统计信息之前,请确保数据帧的格式整洁:
基本上是 1 个观测值/行、1 个变量/列、1 个值/单元格。
在您的情况下,您的"resumo"列中有列表元素(多个值(。
你需要改变这一点。
我会使用与这篇文章给出的相同的解决方案将这些列表元素"分布"到行上:

df_serie = df_selecao_atual.apply(lambda x: pd.Series(x['resumo']),axis=1).stack().reset_index(level=1, drop=True)  
df_serie.name = 'resumo'
df_selecao_atual.drop('resumo', axis=1).join(df_serie)

最新更新