在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)