Controlla se esiste un valore nell'indice del frame di dati di Panda


139

Sono sicuro che esiste un modo ovvio per farlo, ma non riesco a pensare a nulla di lucido in questo momento.

Fondamentalmente invece di sollevare un'eccezione, vorrei ottenere Trueo Falsevedere se esiste un valore nell'indice panda df.

import pandas as pd
df = pd.DataFrame({'test':[1,2,3,4]}, index=['a','b','c','d'])
df.loc['g']  # (should give False)

Quello che lavoro ora è il seguente

sum(df.index == 'g')

1
Che dire di qualsiasi (df.index == 'g')?
luffe,

Risposte:


252

Questo dovrebbe fare il trucco

'g' in df.index

7
Ciò non sembra funzionare quando più voci condividono gli stessi valori di indice.
Massimo

2
@MaximG Cosa intendi? Questo funziona anche per un indice non univoco.
joris,

Funziona anche con multiindice. Se il tuo indice ha lunghezza n, 1..npuoi verificare una tupla di qualsiasi lunghezza da
Minh Triet

2
Per gli altri che vengono qui, potrebbe essere necessario utilizzare 'g' in df.columnsse il tuo frame di dati è stato definito con intestazioni di colonna anziché un indice, ad esempio:df = pandas.DataFrame({'test':[1,2,3,4]}, columns=['a','b','c','d'])
Tahlor

2
Questo tempo è costante o lineare?
Lokesh,

36

Solo per riferimento poiché era qualcosa che stavo cercando, puoi verificare la presenza all'interno dei valori o dell'indice aggiungendo il metodo ".values", ad es.

g in df.<your selected field>.values
g in df.index.values

Trovo che l'aggiunta di ".values" per ottenere un semplice elenco o ndarray faccia esistere o controlli "in" eseguiti più agevolmente con gli altri strumenti Python. Ho pensato di buttarlo là fuori per la gente.


ma AttributeError: l'oggetto 'DataFrame' non ha attributo 'field'
Gank

1
Ciao Gank Il "campo" doveva mostrare che puoi applicare il metodo ".values" a vari campi del frame di dati come colonne o una colonna selezionata. ".index" è un esempio di sostituzione di "campo" con un campo effettivo disponibile :) Immagino che potrebbe essere più chiaro ...
Ezekiel Kruglick

2
Questo è stato davvero utile da sottolineare. Ho un caso gerarchico in cui in g in df.indexproduce vero e in g in df.index.valuesfalso. Interessante.
Watsonic,

@watsonic: un punto di attenzione è quello di vedere se una di quelle sta restituendo tuple a causa della gerarchia. Assicurati di guardare ciò che entrambi stanno pubblicando (ad esempio in ipython o nella riga di comando) per assicurarti di capire con cosa stai confrontando. Un'altra cosa che puoi fare con gli indici gerarchici è df.index.get_level_values ​​(<nome livello>) per rendere le cose più comprensibili, ovviamente a seconda della tua applicazione.
Ezechiele Kruglick,

28

Il multiindice funziona in modo leggermente diverso dal singolo indice. Ecco alcuni metodi per dataframe multi-indicizzato.

df = pd.DataFrame({'col1': ['a', 'b','c', 'd'], 'col2': ['X','X','Y', 'Y'], 'col3': [1, 2, 3, 4]}, columns=['col1', 'col2', 'col3'])
df = df.set_index(['col1', 'col2'])

in df.index funziona per il primo livello solo quando si controlla il valore dell'indice singolo.

'a' in df.index     # True
'X' in df.index     # False

Controlla df.index.levelsaltri livelli.

'a' in df.index.levels[0] # True
'X' in df.index.levels[1] # True

Cerca df.indexuna tupla di combinazione indice.

('a', 'X') in df.index  # True
('a', 'Y') in df.index  # False

2

con DataFrame: df_data

>>> df_data
  id   name  value
0  a  ampha      1
1  b   beta      2
2  c     ce      3

Provai:

>>> getattr(df_data, 'value').isin([1]).any()
True
>>> getattr(df_data, 'value').isin(['1']).any()
True

ma:

>>> 1 in getattr(df_data, 'value')
True
>>> '1' in getattr(df_data, 'value')
False

Così divertente: D


isinnon verificherà il tipo. df['value'].isin([True]).any()prova questo, ti darà anche Vero, Perché corrisponde 1. True -> 1.
Mohamed Thasin ah

1
df = pandas.DataFrame({'g':[1]}, index=['isStop'])

#df.loc['g']

if 'g' in df.index:
    print("find g")

if 'isStop' in df.index:
    print("find a") 

Che cos'è isStop?
Nabin,

1

Il codice seguente non stampa booleano, ma consente la sottosezione dei frame di dati per indice ... Capisco che questo non sia probabilmente il modo più efficiente per risolvere il problema, ma a me (1) piace il modo in cui questo legge e (2) puoi facilmente sottoinsiemi dove esiste l'indice df1 in df2:

df3 = df1[df1.index.isin(df2.index)]

o dove l'indice df1 non esiste in df2 ...

df3 = df1[~df1.index.isin(df2.index)]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.