在熊猫中,如何根据列中的条件使用groupby计算行数?

时间:2018-08-11 15:37:18

标签: python pandas

在python3和pandas中,我具有以下数据框:

candidatos_senado.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 88 entries, 17 to 650
Data columns (total 26 columns):
cpf                                88 non-null object
nome                               88 non-null object
nome_completo                      88 non-null object
partido                            88 non-null object
uf                                 88 non-null object
cargo_parlamentar                  88 non-null object
tipo                               88 non-null object
classe                             88 non-null object
numero                             88 non-null object
único                              88 non-null object
assunto                            88 non-null object
data_inicial                       88 non-null object
data_final                         88 non-null object
andamento                          88 non-null object
link                               88 non-null object
transparencia                      88 non-null object
conferencia                        88 non-null object
data_conferencia                   88 non-null object
resumo                             88 non-null object
observacao                         86 non-null object
link_noticia_tribunal_confiavel    33 non-null object
interessa                          87 non-null object
ministro_relator                   88 non-null object
processo_conectado                 8 non-null object
situacao                           88 non-null object
cadastro_push                      88 non-null object
dtypes: object(26)
memory usage: 18.6+ KB

此数据框的每一行都包含有关法律程序的信息,每行一个诉讼案件

“ nome”列中的人名,例如:

FULANO DE TAL
BELTRANO DA SILVA
SICRANO APARECIDO
NINGUEM AUGUSTO

“ tipo”列中包含诉讼的类型,只有两种:

INQ
AP

我已经计算出每个名称中有多少个AP和多少个INQ,并创建了一个数据框:

conta = candidatos_senado.groupby(['tipo','nome']).size().reset_index()
conta.columns = ['type_of_court_case', 'name', 'count']
conta.reset_index()

    index   type_of_court_case  name           count
0   0       AP              ALFREDO NASCIMENTO  1
1   1       AP              IZALCI LUCAS        1
2   2       AP              JOSÉ REINALDO       1
3   3       AP              RENAN CALHEIROS     1
4   4       AP              SÉRGIO PETECÃO      2
5   5       AP              ZECA DO PT          2
6   6       INQ             ALFREDO NASCIMENTO  5
7   7       INQ             CRISTOVAM BUARQUE   1
8   8       INQ             EDISON LOBÃO        7

...

但是我的计数只能使用在列中找到的条件来进行。

“ interessa”列已键入“ sim”或“não”。

我只想计算“ interessa”列中具有“ sim”的行的AP或INQ的数量,如果没有这种情况,我应该忽略该行

请,有人知道我该怎么做吗?

1 个答案:

答案 0 :(得分:1)

我认为需要先用boolean indexingisin过滤DataFrame,再在interessa列中输入另一个值:

df = candidatos_senado[candidatos_senado["interessa"].isin(["sim", "não"])]

然后如果需要,也可以在interessa列中进行计数:

conta = df.groupby(['tipo','nome','interessa']).size().reset_index(name='count')

如果要使用原始解决方案:

conta1 = df.groupby(['tipo','nome']).size().reset_index(name='count')

如果仅按tipo列进行计数:

conta2 = df.groupby('tipo').size().reset_index(name='count')

示例

candidatos_senado = pd.DataFrame({'tipo':['INQ','INQ','INQ','AP','AP','AP'],
                   'interessa':['sim','ABC','sim','d','não','não'],
                   'val':[7,8,9,4,2,3],
                   'nome':list('CDCDCD')})

print (candidatos_senado)
  tipo interessa  val nome
0  INQ       sim    7    C
1  INQ       ABC    8    D
2  INQ       sim    9    C
3   AP         d    4    D
4   AP       não    2    C
5   AP       não    3    D

df = candidatos_senado[candidatos_senado["interessa"].isin(["sim", "não"])]

conta = df.groupby(['tipo','nome','interessa']).size().reset_index(name='count')
print (conta)
  tipo nome interessa  count
0   AP    C       não      1
1   AP    D       não      1
2  INQ    C       sim      2

conta1 = df.groupby(['tipo','nome']).size().reset_index(name='count')
print (conta1)
  tipo nome  count
0   AP    C      1
1   AP    D      1
2  INQ    C      2

conta2 = df.groupby('tipo').size().reset_index(name='count')
print (conta2)
  tipo  count
0   AP      2
1  INQ      2