Sprawdź, czy wartość istnieje w indeksie ramki danych pandy

139

Jestem pewien, że jest na to oczywisty sposób, ale nie mogę teraz wymyślić nic sprytnego.

Zasadniczo zamiast zgłaszać wyjątek, chciałbym uzyskać Truelub Falsesprawdzić, czy istnieje wartość w dfindeksie pand .

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

To, co teraz pracuję, jest następujące

sum(df.index == 'g')
Abhi
źródło
1
A co z każdym (df.index == 'g')?
luffe

Odpowiedzi:

252

To powinno załatwić sprawę

'g' in df.index
Guillaume Jacquenot
źródło
7
Wydaje się, że to nie działa, gdy kilka wpisów ma te same wartości indeksu.
MaximG,
2
@MaximG Co masz na myśli? Działa to również w przypadku nieunikalnego indeksu.
joris
Działa również dla wielu indeksów. Jeśli twój indeks ma długość n, 1..nmożesz sprawdzić krotkę o dowolnej długości od
Minh Triet
2
W przypadku innych przyjeżdżających tutaj może być konieczne użycie, 'g' in df.columnsjeśli twoja ramka danych została zdefiniowana z nagłówkami kolumn, a nie indeksem, np .:df = pandas.DataFrame({'test':[1,2,3,4]}, columns=['a','b','c','d'])
Tahlor
2
Czy jest to stały czas czy liniowy?
Lokesh
36

Dla odniesienia, ponieważ było to coś, czego szukałem, możesz sprawdzić obecność w wartościach lub indeksie, dołączając metodę „.values”, np.

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

Uważam, że dodanie „.values” w celu uzyskania prostej listy lub ndarray powoduje, że kontrole istnieją lub „w” działają płynniej z innymi narzędziami Pythona. Pomyślałem, że rzucę to dla ludzi.

Ezekiel Kruglick
źródło
ale AttributeError: Obiekt „DataFrame” nie ma atrybutu „pole”
Gank
1
Cześć Gank. „Pole” miało pokazywać, że można zastosować metodę „.values” do różnych pól ramki danych, takich jak kolumny lub wybrana kolumna. ".index" to przykład zastąpienia "pola" faktycznym polem, które jest dostępne :) Myślę, że to mogłoby być bardziej zrozumiałe ...
Ezekiel Kruglick
2
To było naprawdę pomocne. Mam przypadek hierarchiczny, w którym in g in df.indexprodukuje prawda i in g in df.index.valuesfałsz. Ciekawy.
watsonic
@watsonic - jeden punkt ostrzegawczy polega na sprawdzeniu, czy któryś z nich zwraca krotki z powodu hierarchii. Sprawdź, co wypuszczają oba (np. W ipythonie lub linii poleceń), aby upewnić się, że rozumiesz, z czym porównujesz. Inną rzeczą, którą możesz zrobić z indeksami hierarchicznymi, jest df.index.get_level_values ​​(<nazwa poziomu>), aby uczynić rzeczy bardziej zrozumiałymi - w zależności od zastosowania.
Ezekiel Kruglick,
28

Wiele indeksów działa trochę inaczej niż pojedynczy indeks. Oto kilka metod dla multi-indeksowanej ramki danych.

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 działa na pierwszym poziomie tylko podczas sprawdzania wartości pojedynczego indeksu.

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

Sprawdź df.index.levelsinne poziomy.

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

Sprawdź, df.indexczy istnieje krotka kombinacji indeksów.

('a', 'X') in df.index  # True
('a', 'Y') in df.index  # False
brokuły2000
źródło
2

z DataFrame: df_data

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

Próbowałem:

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

ale:

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

Tak fajnie: D

Quoc Chi
źródło
isinnie sprawdzi dtype. df['value'].isin([True]).any()spróbuj tego, to również da ci True, ponieważ pasuje do 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") 
Gank
źródło
Co to jest Stop?
Nabin
1

Poniższy kod nie drukuje wartości logicznych, ale pozwala na podzbiór ramek danych według indeksu ... Rozumiem, że to prawdopodobnie nie jest najbardziej efektywny sposób rozwiązania problemu, ale (1) podoba mi się sposób, w jaki to czyta i (2) możesz łatwo podzielić gdzie indeks df1 istnieje w df2:

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

lub gdzie indeks df1 nie istnieje w df2 ...

df3 = df1[~df1.index.isin(df2.index)]
xxyjoel
źródło