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.