Periksa apakah ada nilai dalam indeks bingkai data pandas


145

Saya yakin ada cara yang jelas untuk melakukan ini tetapi tidak dapat memikirkan sesuatu yang licin sekarang.

Pada dasarnya alih-alih meningkatkan pengecualian, saya ingin mendapatkan Trueatau Falsemelihat apakah ada nilai dalam dfindeks pandas .

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

Apa yang saya kerjakan sekarang adalah sebagai berikut

sum(df.index == 'g')

1
Bagaimana dengan (df.index == 'g')?
luffe

Jawaban:


264

Ini seharusnya berhasil

'g' in df.index

7
Ini tampaknya tidak berfungsi jika beberapa entri berbagi nilai indeks yang sama.
MaximG

2
@MaximG Apa maksudmu? Ini juga berfungsi untuk indeks non-unik.
joris

Juga bekerja untuk multi indeks. Jika indeks Anda memiliki panjang n, maka tupel dengan panjang berapa pun 1..ndapat diperiksa
Minh Triet

2
Untuk orang lain yang datang ke sini, Anda mungkin perlu menggunakan 'g' in df.columnsjika kerangka data Anda ditentukan dengan tajuk kolom daripada indeks, misalnya:df = pandas.DataFrame({'test':[1,2,3,4]}, columns=['a','b','c','d'])
Tahlor

3
Apakah ini waktu konstan atau linier?
Lokesh

38

Hanya untuk referensi karena itu adalah sesuatu yang saya cari, Anda dapat menguji keberadaan dalam nilai atau indeks dengan menambahkan metode ".values", misalnya

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

Saya menemukan bahwa menambahkan ".values" untuk mendapatkan daftar sederhana atau ndarray out membuat ada atau "dalam" pemeriksaan berjalan lebih lancar dengan alat python lainnya. Hanya berpikir saya akan melemparkannya ke luar sana untuk orang-orang.


tetapi AttributeError: objek 'DataFrame' tidak memiliki atribut 'bidang'
Gank

1
Hai Gank. "Bidang" seharusnya menunjukkan bahwa Anda dapat menerapkan metode ".values" ke berbagai bidang bingkai data seperti kolom atau kolom yang dipilih. ".index" adalah contoh penggantian "bidang" dengan bidang aktual yang tersedia :) Saya rasa itu bisa lebih jelas ...
Ezekiel Kruglick

2
Ini sangat membantu untuk ditunjukkan. Saya memiliki kasus hierarki di mana in g in df.indexmenghasilkan benar dan in g in df.index.valuessalah. Menarik.
watsonic

@watsonic - satu hal yang perlu diperhatikan untuk melihat apakah salah satu dari mereka mengembalikan tupel karena hierarki. Pastikan untuk melihat apa yang keduanya diletakkan (misalnya di ipython atau baris perintah) untuk memastikan Anda memahami apa yang Anda bandingkan. Hal lain yang dapat Anda lakukan dengan indeks hierarki adalah df.index.get_level_values ​​(<nama level>) untuk membuatnya lebih mudah dipahami - tentu saja tergantung pada aplikasi Anda.
Yehezkiel Kruglick

28

Multi index bekerja sedikit berbeda dari single index. Berikut beberapa metode untuk dataframe multi-indeks.

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 bekerja untuk tingkat pertama hanya saat memeriksa nilai indeks tunggal.

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

Periksa df.index.levelslevel lainnya.

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

Periksa df.indextupel kombinasi indeks.

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

2

dengan DataFrame: df_data

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

Saya mencoba:

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

tapi:

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

Sangat menyenangkan: D


isintidak akan memeriksa dtype tersebut. df['value'].isin([True]).any()coba ini, itu juga akan memberi Anda Benar, Karena cocok dengan 1. True -> 1.
Mohamed Thasin ah

2

Kode di bawah ini tidak mencetak boolean, tetapi memungkinkan subset dataframe berdasarkan indeks ... Saya mengerti ini mungkin bukan cara yang paling efisien untuk menyelesaikan masalah, tetapi saya (1) suka cara membaca ini dan (2) Anda dapat dengan mudah membuat subset di mana indeks df1 ada di df2:

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

atau di mana indeks df1 tidak ada di df2 ...

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

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

Apa isStop?
Nabin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.