在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
所有都是针对“ 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.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'}}
答案 0 :(得分: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
答案 1 :(得分:1)
在能够使用数据透视,分组依据或聚合功能获取摘要统计信息之前,请确保您的数据框采用整洁的格式:
基本上是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)