在python3和pandas中,我有一个数据框,其中每行包含有关法律程序的信息。
“ nome”列中包含人员姓名,“ 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
我需要数:
For each name
Divided by INQ and AP processes
The appearance of each individual crime between ","
以“ resumo”列上方的示例为例,并假设它们都与“ 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[['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'}}
在该数据库上,我已经有一个很好的答案,可以通过以下链接进行操作:In pandas, how to count items between commas, dividing between column types?
但是现在我不仅需要在屏幕上显示,还需要创建一个数据框。像这样:
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
请,有人知道我如何创建此数据框吗?
答案 0 :(得分:3)
您可以在split
DataFrame
列中创建另一个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
如果要在最后一个解决方案中使用Counter
解决方案:
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
答案 1 :(得分:1)
几乎与Jez一样的逻辑,将字符串更改为list
,然后将list
嵌套,然后我们只需groupby
并创建计数
newdf=df.set_index(['nome','tipo'])['resumo'].str.split(',').apply(pd.Series).stack().to_frame('resumo').reset_index(level=[0,1])
newdf['count']=newdf.groupby(['nome','tipo','resumo'])['resumo'].transform('size')
newdf
Out[172]:
nome tipo resumo count
0 CÉSAR MESSIAS INQ Desvio de verbas públicas 1
0 CÉSAR MESSIAS AP Desvio de verbas públicas 1
0 FLAVIANO MELO INQ Prestação de contas rejeitada 1
0 FLAVIANO MELO AP Peculato 1
1 FLAVIANO MELO AP Gestão fraudulenta 1