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')

1
A co z każdym (df.index == 'g')?
luffe

Odpowiedzi:


252

To powinno załatwić sprawę

'g' in df.index

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.


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

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


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") 

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)]
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.