index - python pandas tutorial portugues




Filtre as linhas do dataframe se o valor na coluna estiver em uma lista de valores configurados (5)

Fatiar dados com pandas

Dado um dataframe como este:

    RPT_Date  STK_ID STK_Name  sales
0 1980-01-01       0   Arthur      0
1 1980-01-02       1    Beate      4
2 1980-01-03       2    Cecil      2
3 1980-01-04       3     Dana      8
4 1980-01-05       4     Eric      4
5 1980-01-06       5    Fidel      5
6 1980-01-07       6   George      4
7 1980-01-08       7     Hans      7
8 1980-01-09       8   Ingrid      7
9 1980-01-10       9    Jones      4

Existem várias maneiras de selecionar ou fatiar os dados.

Usando .isin

O mais óbvio é o recurso .isin . Você pode criar uma máscara que forneça uma série de instruções True / False , que podem ser aplicadas a um dataframe como este:

mask = df['STK_ID'].isin([4, 2, 6])

mask
0    False
1    False
2     True
3    False
4     True
5    False
6     True
7    False
8    False
9    False
Name: STK_ID, dtype: bool

df[mask]
    RPT_Date  STK_ID STK_Name  sales
2 1980-01-03       2    Cecil      2
4 1980-01-05       4     Eric      4
6 1980-01-07       6   George      4

O mascaramento é a solução ad-hoc para o problema, mas nem sempre funciona bem em termos de velocidade e memória.

Com indexação

Ao definir o índice para a coluna STK_ID , podemos usar os pandas incorporados ao objeto de fatiamento .loc

df.set_index('STK_ID', inplace=True)
         RPT_Date STK_Name  sales
STK_ID                           
0      1980-01-01   Arthur      0
1      1980-01-02    Beate      4
2      1980-01-03    Cecil      2
3      1980-01-04     Dana      8
4      1980-01-05     Eric      4
5      1980-01-06    Fidel      5
6      1980-01-07   George      4
7      1980-01-08     Hans      7
8      1980-01-09   Ingrid      7
9      1980-01-10    Jones      4

df.loc[[4, 2, 6]]
         RPT_Date STK_Name  sales
STK_ID                           
4      1980-01-05     Eric      4
2      1980-01-03    Cecil      2
6      1980-01-07   George      4

Essa é a maneira mais rápida de fazer isso, mesmo que a indexação demore um pouco, economiza tempo se você quiser fazer várias consultas como essa.

Mesclando Dataframes

Isso também pode ser feito mesclando quadros de dados. Isso se encaixaria mais em um cenário em que você tem muito mais dados do que nesses exemplos.

stkid_df = pd.DataFrame({"STK_ID": [4,2,6]})
df.merge(stkid_df, on='STK_ID')
   STK_ID   RPT_Date STK_Name  sales
0       2 1980-01-03    Cecil      2
1       4 1980-01-05     Eric      4
2       6 1980-01-07   George      4

Nota

Todos os métodos acima funcionam mesmo se houver várias linhas com o mesmo 'STK_ID'

Esta questão já tem uma resposta aqui:

Eu tenho um pandas DataFrame rpt Python:

rpt
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 47518 entries, ('000002', '20120331') to ('603366', '20091231')
Data columns:
STK_ID                    47518  non-null values
STK_Name                  47518  non-null values
RPT_Date                  47518  non-null values
sales                     47518  non-null values

Eu posso filtrar as linhas cujo ID de estoque é '600809' assim: rpt[rpt['STK_ID'] == '600809']

<class 'pandas.core.frame.DataFrame'>
MultiIndex: 25 entries, ('600809', '20120331') to ('600809', '20060331')
Data columns:
STK_ID                    25  non-null values
STK_Name                  25  non-null values
RPT_Date                  25  non-null values
sales                     25  non-null values

e quero juntar todas as linhas de algumas ações, como ['600809','600141','600329'] . Isso significa que eu quero uma sintaxe como esta:

stk_list = ['600809','600141','600329']

rst = rpt[rpt['STK_ID'] in stk_list] # this does not works in pandas 

Como os pandas não aceitam o comando acima, como atingir o alvo?


Use o método isin . rpt[rpt['STK_ID'].isin(stk_list)] .


Você também pode query diretamente seu DataFrame para obter essas informações.

rpt.query('STK_ID in (600809,600141,600329)')

Ou, da mesma forma, pesquise por intervalos:

rpt.query('60000 < STK_ID < 70000')

Você também pode obter resultados semelhantes usando 'consulta' e @:

por exemplo:

df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'f']})
df = pd.DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3, 5]})
list_of_values = [3,6]
result= df.query("A in @list_of_values")
result
   A  B
1  6  2
2  3  3

isin() é ideal se você tiver uma lista de correspondências exatas, mas se você tiver uma lista de correspondências parciais ou substrings para procurar, poderá filtrar usando o método str.contains e expressões regulares.

Por exemplo, se quisermos retornar um DataFrame, onde todas as IDs de ações que começam com '600' e, em seguida, são seguidas por quaisquer três dígitos:

>>> rpt[rpt['STK_ID'].str.contains(r'^600[0-9]{3}$')] # ^ means start of string
...   STK_ID   ...                                    # [0-9]{3} means any three digits
...  '600809'  ...                                    # $ means end of string
...  '600141'  ...
...  '600329'  ...
...      ...   ...

Suponha agora que temos uma lista de sequências com as quais queremos que os valores em 'STK_ID' terminem, por exemplo

endstrings = ['01$', '02$', '05$']

Podemos juntar essas strings com o caractere regex 'ou' | e passe a string para str.contains para filtrar o DataFrame:

>>> rpt[rpt['STK_ID'].str.contains('|'.join(endstrings)]
...   STK_ID   ...
...  '155905'  ...
...  '633101'  ...
...  '210302'  ...
...      ...   ...

Por fim, contains pode ignorar maiúsculas e minúsculas (definindo case=False ), permitindo que você seja mais genérico ao especificar as strings que deseja corresponder.

Por exemplo,

str.contains('pandas', case=False)

corresponderia a PANDAS , PanDAs , paNdAs123 e assim por diante.





dataframe