Python Pandas'ta bir DataFrame'de iki değer arasındaki satırlar nasıl seçilir?


102

Bir DataFrame'i dfyalnızca sütundaki değerlerin closing_price99 ile 101 arasında olduğu satırları içerecek şekilde değiştirmeye ve bunu aşağıdaki kodla yapmaya çalışıyorum.

Ancak, hatayı alıyorum

ValueError: Bir Serinin doğruluk değeri belirsizdir. A.empty, a.bool (), a.item (), a.any () veya a.all () kullanın

ve bunu döngüler kullanmadan yapmanın bir yolu olup olmadığını merak ediyorum.

df = df[(99 <= df['closing_price'] <= 101)]

Buradaki sorun, bir skalayı bir diziyle karşılaştıramazsınız, bu nedenle hata, karşılaştırmalar için bitsel operatörleri kullanmanız ve operatör önceliği nedeniyle onları parantez içine almanız gerekir
EdChum

df.queryve pd.evalbu kullanım durumu için uygun görünüyor. pd.eval()İşlevler ailesi, özellikleri ve kullanım durumları hakkında bilgi için lütfen pd.eval () kullanarak pandalarda Dinamik İfade Değerlendirmesini ziyaret edin .
cs95

Yanıtlar:


109

()Belirsizliği gidermek için boole vektörünüzü gruplandırmak için kullanmalısınız .

df = df[(df['closing_price'] >= 99) & (df['closing_price'] <= 101)]

178

Ayrıca aşağıdakiler arasında seriler de düşünün :

df = df[df['closing_price'].between(99, 101)]

6
Seçenek inclusive=Truevarsayılan olarak betweendf = df[df['closing_price'].between(99, 101)]
şurada

3
bu en iyi cevap! iyi iş!
PEBKAC

Pandalarda "arada olmayan" işlevi var mı? Ben bulamıyorum.
dsugasa

3
@dsugasa, tilde operatörünü ile kullanın between.
Parfait

1
@dsugasa egdf = df[~df['closing_price'].between(99, 101)]
33

23

daha güzel bir alternatif var - query () yöntemini kullanın :

In [58]: df = pd.DataFrame({'closing_price': np.random.randint(95, 105, 10)})

In [59]: df
Out[59]:
   closing_price
0            104
1             99
2             98
3             95
4            103
5            101
6            101
7             99
8             95
9             96

In [60]: df.query('99 <= closing_price <= 101')
Out[60]:
   closing_price
1             99
5            101
6            101
7             99

GÜNCELLEME: yorumu cevaplama:

Buradaki sözdizimini beğendim ama ifade ile birleştirmeye çalışırken düştüm; df.query('(mean + 2 *sd) <= closing_price <=(mean + 2 *sd)')

In [161]: qry = "(closing_price.mean() - 2*closing_price.std())" +\
     ...:       " <= closing_price <= " + \
     ...:       "(closing_price.mean() + 2*closing_price.std())"
     ...:

In [162]: df.query(qry)
Out[162]:
   closing_price
0             97
1            101
2             97
3             95
4            100
5             99
6            100
7            101
8             99
9             95

Buradaki sözdizimini beğendim ama ifade ile birleştirmeye çalışırken düştüm; df.query ('(ortalama + 2 * sd) <= kapanış_price <= (ortalama + 2 * sd)')
eşleme dom

1
@mappingdom, nedir meanve sd? Bunlar sütun isimleri mi?
MaxU

hayır, bunlar bir kayan nokta olarak saklanan hesaplanan ortalama ve standart sapmadır
eşleme dom

@mappingdom, "depolandı" derken ne demek istiyorsun?
MaxU

@mappingdom, gönderimi güncelledim - istediğin bu muydu?
MaxU

9

.between()yöntemi de kullanabilirsin

emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv")

emp[emp["Salary"].between(60000, 61000)]

Çıktı

görüntü açıklamasını buraya girin


7
newdf = df.query('closing_price.mean() <= closing_price <= closing_price.std()')

veya

mean = closing_price.mean()
std = closing_price.std()

newdf = df.query('@mean <= closing_price <= @std')

3

Birden çok değer ve birden çok girdi ile uğraşıyorsanız, bunun gibi bir uygulama işlevi de ayarlayabilirsiniz. Bu durumda, belirli aralıklarla düşen GPS konumları için bir veri çerçevesinin filtrelenmesi.

def filter_values(lat,lon):
    if abs(lat - 33.77) < .01 and abs(lon - -118.16) < .01:
        return True
    elif abs(lat - 37.79) < .01 and abs(lon - -122.39) < .01:
        return True
    else:
        return False


df = df[df.apply(lambda x: filter_values(x['lat'],x['lon']),axis=1)]

1

Bunun yerine

df = df[(99 <= df['closing_price'] <= 101)]

Bunu kullanmalısın

df = df[(df['closing_price']>=99 ) & (df['closing_price']<=101)]

Sorguları birleştirmek için NumPy'nin bitsel Mantık operatörlerini |, &, ~, ^ kullanmalıyız. Ayrıca parantezler operatör önceliği açısından önemlidir.

Daha fazla bilgi için, Karşılaştırmalar, Maskeler ve Boole Mantığı bağlantısını ziyaret edebilirsiniz.

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.