Panda veri çerçevesi dizininde bir değer olup olmadığını kontrol edin


139

Bunu yapmak için açık bir yol olduğundan eminim ama şu anda kaygan bir şey düşünemiyorum.

Temelde istisna artırmak yerine pandalar dizininde bir değer olup olmadığını görmek Trueveya Falsegörmek istiyorum df.

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

Şu anda çalıştığım şey şu

sum(df.index == 'g')

1
Peki ya (df.index == 'g')?
luffe

Yanıtlar:


252

Bu hile yapmalı

'g' in df.index

7
Birden fazla giriş aynı dizin değerlerini paylaştığında bu işe yaramıyor gibi görünüyor.
MaximG

2
@MaximG Ne demek istiyorsun? Bu, benzersiz olmayan bir dizin için de geçerlidir.
joris

Ayrıca çoklu indeks için çalışın. Dizininiz uzunluğa sahipse n, herhangi bir uzunluktaki bir demet 1..nkontrol edilebilir
Minh Triet

2
Buraya gelen diğer kullanıcılar için 'g' in df.columns, veri çerçeveniz bir dizin yerine sütun başlıklarıyla tanımlanmışsa kullanmanız gerekebilir , örneğin:df = pandas.DataFrame({'test':[1,2,3,4]}, columns=['a','b','c','d'])
Tahlor

2
Bu sabit zaman mı yoksa doğrusal mı?
Lokesh

36

Sadece aradığım bir şey olduğu için, ".values" yöntemini ekleyerek değerler veya dizin içindeki varlığını test edebilirsiniz.

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

Basit bir liste veya ndarray dışarı almak için ".values" eklemenin var olduğunu veya "in" denetimleri diğer python araçları ile daha sorunsuz çalışır buluyorum. Sadece bunu insanlar için fırlatacağımı düşündüm.


ancak AttributeError: 'DataFrame' nesnesinin 'field' özelliği yok
Gank

1
Merhaba Gank. "Alan" ın, veri çerçevesinin sütunlar veya seçilen bir sütun gibi çeşitli alanlarına ".values" yöntemini uygulayabileceğinizi göstermesi gerekiyordu. ".index", "alan" ı mevcut gerçek bir alanla değiştirmenin bir örneğidir :) Sanırım bu daha net olabilir ...
Ezekiel Kruglick

2
Bu işaret gerçekten yararlı oldu. in g in df.indexDoğru ve in g in df.index.valuesyanlış üreten hiyerarşik bir durumum var . İlginç.
watsonic

@watsonic - bunlardan birinin hiyerarşi nedeniyle tuple döndürüp döndürmediğini görmek için bir uyarı noktası var. Neyle karşılaştırdığınızı anladığınızdan emin olmak için her ikisinin de ortaya koyduğundan emin olun (örn. İpython veya komut satırında). Hiyerarşik dizinlerle yapabileceğiniz başka bir şey, elbette uygulamanıza bağlı olarak işleri daha anlaşılır hale getirmek için df.index.get_level_values ​​(<düzey adı>).
Ezekiel Kruglick

28

Çoklu indeks, tek indeksten biraz farklı çalışır. Çok endeksli veri çerçevesi için bazı yöntemler.

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 sadece tek bir indeks değeri kontrol edilirken ilk seviye için çalışır.

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

df.index.levelsDiğer seviyeleri kontrol edin .

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

df.indexBir dizin kombinasyonu kümesi olup olmadığını kontrol edin .

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

2

DataFrame ile: df_data

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

Denedim:

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

fakat:

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

Çok eğlenceli: D


isindtype'yi kontrol etmez. df['value'].isin([True]).any()bunu deneyin, aynı zamanda size doğru verecektir, çünkü ile eşleşir 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") 

İsStop nedir?
Nabin

1

Aşağıdaki kod boole yazdırmıyor, ancak dizine göre veri çerçevesi alt kümesine izin veriyor ... Bunun muhtemelen sorunu çözmenin en etkili yolu olmadığını anlıyorum, ancak ben (1) bunun okuma şekli gibi ve (2) kolayca alt küme oluşturabilirsiniz burada df1 dizini df2'de bulunur:

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

veya df2 dizininde df2 dizininde bulunmadığında ...

df3 = df1[~df1.index.isin(df2.index)]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.