1
resposta

Diferença na contagem de células no Pandas e Excel

Olá, eu tenho uma base de dados com 24mil linhas, mas notei algumas discrepâncias ao realizar a contagem de linhas:

Base = 24mil linhas
Pandas = 23998 linhas

Ao realizar a contagem de linhas com o filtro

select_xv_masc_adulto = dataset.query('modalidade == "XV" and genero == "Masculino" and categoria == "Adulto"')
select_xv_masc_adulto.count()
data                            8771
hora                            3824
tipo                            8771
modalidade                      8771
genero                          8771
categoria                       8771
time_casa                       8768
estado_origem_time_casa         8769
t_casa                          1252
c_casa                          1252
p_casa                          1249
d_casa                          1249
parcial_time_casa                822
final_time_casa                 8685
X                               8771
final_time_visitante            8685
parcial_time_visitante           109
t_visitante                     1640
c_visitante                     1641
p_visitante                     1636
d_visitante                     1634
visitante                       8767
estado_origem_time_visitante    8768
wo                              8771
arbitro                         2201
auxiliar_1                      1667
auxiliar_2                      1626
4_arbitro                       1320
local                           4128
campeonato_1                    7549
campeonato_2                      80
fase                            1851
cidade                          6041
estado                          8761
total_pontos_1t                 8771
diferenca_pontos_1t             8771
total_pontos_2t                 8771
diferenca_pontos_2t             8771
total_pontos_final              8771
diferenca_pontos_final          8771
prorrogação                     8771
adiado                          8771
cancelado                       8771
Observação_jogo                  201
tempo_jogo_min                    48
indefinido                         4
Unnamed: 46                        0
Unnamed: 47                        0
Unnamed: 48                        0
Unnamed: 49                        0
Unnamed: 50                        0
Unnamed: 51                        0
Unnamed: 52                        0
Unnamed: 53                        0
dtype: int64

Ou seja, ele retorna 8771 jogos, mas o excel encontra 9000 jogos

Por fim, ao tentar visualizar a tabela com o comando dataset[select_xv_masc_adulto]

Encontro o seguinte erro

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-31-3ff597c5d5f7> in <module>()
----> 1 dataset[select_xv_masc_adulto]

2 frames
/usr/local/lib/python3.7/dist-packages/pandas/core/generic.py in _where(self, cond, other, inplace, axis, level, errors, try_cast)
   8770                 for dt in cond.dtypes:
   8771                     if not is_bool_dtype(dt):
-> 8772                         raise ValueError(msg.format(dtype=dt))
   8773         else:
   8774             # GH#21947 we have an empty DataFrame/Series, could be object-dtype

ValueError: Boolean array expected for the condition, not object
1 resposta

Olá Daniel! Como você está?

Sinto muito pela demora em te dar um retorno.

Esse erro é gerado porque a sua variável select_xv_masc_adulto está armazenando um dataframe e ao fazer dataset[select_xv_masc_adulto] você está tentando pegar um dataframe e passar um outro dataframe pra ele. E isso não é possível, porque quando você faz uma query ela já te retorna um dataframe contendo apenas aqueles dados de acordo com a procura que você fez. Sendo assim, para visualizar sua tabela, basta apenas colocar o select_xv_masc_adulto que já deve mostrar certinho :)

Um exemplo de uma query para que você consiga visualizar melhor o que acontece:

Imagem com um dataframe exemplificando a utilização do metodo query

Agora, para fazer um filtro da forma como você estava tentando dataset[select_xv_masc_adulto] seria necessário que sua variável select_xv_masc_adulto estivesse armazenando valores booleanos (True e False). Um exemplo desse tipo de seleção, seria:

select_xv_masc_adulto = dataset['modalidade'] == 'XV'

dataset[select_xv_masc_adulto]

Dessa forma, a variável select_xv_masc_adulto estaria armazenando valores booleanos de acordo com a condição passada, portanto, apenas as linhas em que a modalidade for "XV" terão o valor True e quando você passa esses valores booleanos para seu dataframe dataset[select_xv_masc_adulto] ele vai mostrar apenas os valores que satisfaça a condição passada.

De uma forma geral, você pode fazer as seleções tanto por essa maneira quanto por meio de queries. Mas as queries são um pouco mais práticas, uma vez que já te retornam o dataframe apenas com os dados selecionados.

Agora, em relação a diferença na contagem das linhas no Excel e no Python, fazendo alguns testes aqui eu percebi que quando fazemos um count() no dataframe, ele conta o número de linhas mas não considera a linha contendo o cabeçalho (nomes das colunas), já no excel se formos contar essas linhas olhando pela numeração da planilha, a linha do cabeçalho também acaba sendo considerada, e isso pode gerar uma pequena diferença na hora de comparar o número de linhas nesses dois casos.

Existe também a possibilidade de sua base de dados estar com algum problema de organização. Sendo assim, na hora de fazer a importação dos dados para o python, ele não consegue bem separar todas as colunas e linhas precisamente, o que acaba gerando essa diferença na hora de comparar o número de linhas.

Mas infelizmente não dá pra fazermos essas afirmações com total certeza, porque não fizemos os testes na sua base de dados, então seria interessante que essa coluna que está dando essa diferença na contagem, fosse analisada mais detalhadamente.

Espero que isso te ajude! Qualquer dúvida estou a disposição.

Bons estudos! :)