Python 在Pandas中,如何从以逗号分隔的列中的项目计数创建数据帧?

Python 在Pandas中,如何从以逗号分隔的列中的项目计数创建数据帧?,python,pandas,dataframe,Python,Pandas,Dataframe,在python3和pandas中,我有一个数据框,每行包含关于法律程序的信息 nome列有人名,tipo列有诉讼类型,只有INQ和AP两种类型 而且resumo专栏已经在法庭诉讼中对犯罪进行了调查。但每个法律程序可能包括一项或多项罪行。犯罪行为之间用下列符号隔开: Peculato, Lavagem de Dinheiro Corrupção passiva, Ocultação de bens, Lavagem de dinheiro Corrupção passiva,

在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'}}
在这个数据库上,我已经有了一个在这个链接中运行得非常好的答案:

但现在我不仅需要在屏幕上显示,还需要创建一个数据帧。像这样:

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
请问,有人知道我如何创建此数据框吗?

您可以通过resumo列创建另一个数据框,并将其添加到原始数据框中,然后使用groupby进行计数:

如果要将计数器解决方案与最后一个解决方案一起使用:

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

与Jez的逻辑几乎相同,将字符串更改为list,然后取消对列表的测试,然后我们只需分组并创建计数

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

非常感谢你。但我在执行时出错了。我很抱歉,这是我的错。代码现在起作用了再次感谢你@jezrael。我现在看到了一个小问题:当之前有空格时,脚本会区分字符串-比如Corrupçço ativa和Corrupço atipaplease,有没有办法消除这个空格并正确计数?@reinaldchaves-如何工作更改df.pop'resumo'.str.split',,expand=True到df.pop'resumo'.str.split',\s*',expand=True-按,零个或多个空格?
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