在pandas中,如何在逗号和列类型之间进行计数?

2024-09-28 03:20:08 发布

您现在位置:Python中文网/ 问答频道 /正文

在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

而“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

我要数数:

  • 在每个名称中

  • 除以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'}}

Tags: forobjectdenullapnonnomecrimes
2条回答

使用示例数据,可以通过', '进行聚合,然后使用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

在使用pivot、group by或aggregate函数获取摘要统计信息之前,请确保数据帧的格式整洁:
基本上是1个观察值/行,1个变量/列,1个值/单元格。
在您的例子中,“resumo”列中有列表元素(几个值)。
你需要改变这一点。
我将使用与post相同的解决方案将这些列表元素“分布”到行上:

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)

相关问题 更多 >

    热门问题