En python3 et pandas, j'ai un dataframe qui contient pour chaque ligne des informations sur les procédures judiciaires.
La colonne "nome" a des noms de personnes, la colonne "tipo" a les types de poursuites, seulement deux types INQ
et AP
.
Et la colonne "Resumo" contient des enquêtes sur les crimes en vue de poursuites judiciaires. Mais chaque processus juridique peut consister en un ou plusieurs crimes. Et les crimes sont séparés par ",":
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
J'ai besoin de compter:
For each name
Divided by INQ and AP processes
The appearance of each individual crime between ","
Prenons l'exemple au-dessus de la colonne "Resumo", et en supposant qu'ils concernent tous la personne "John Doe".
Les deux premières lignes sont de type AP
et le reste INQ
, puis John Doe a:
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
Un échantillon des lignes ressemble à
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'}}
Sur cette base de données j'avais déjà une réponse qui fonctionnait très bien dans ce lien: Dans les pandas, comment compter les éléments entre virgules, en divisant entre les types de colonnes?
Mais maintenant, je dois non seulement afficher à l'écran, mais créer un dataframe. Comme ça:
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
S'il vous plaît, est-ce que quelqu'un sait comment je pourrais créer ce dataframe?
Vous pouvez en créer une autre DataFrame
par colonne et l'ajouter à l'original par , puis pour compter utiliser avec :split
resumo
join
groupby
size
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
Si vous voulez utiliser une Counter
solution avec la dernière solution:
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
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots