Panda DataFrame için 'içeri' ve 'içeri' nasıl uygulanır?
Pandalar teklifler iki yöntem: Series.isinve DataFrame.isinsırasıyla Serisi ve DataFrames için.
Bir Sütuna Dayalı DataFrame'i Filtrele (Seri için de geçerlidir)
En yaygın senaryo, isinDataFrame'deki satırları filtrelemek için belirli bir sütuna bir koşul uygulamaktır .
df = pd.DataFrame({'countries': ['US', 'UK', 'Germany', np.nan, 'China']})
df
countries
0 US
1 UK
2 Germany
3 China
c1 = ['UK', 'China'] # list
c2 = {'Germany'} # set
c3 = pd.Series(['China', 'US']) # Series
c4 = np.array(['US', 'UK']) # array
Series.isinçeşitli türleri girdi olarak kabul eder. Aşağıdakilerin hepsi, istediğinizi elde etmenin geçerli yollarıdır:
df['countries'].isin(c1)
0 False
1 True
2 False
3 False
4 True
Name: countries, dtype: bool
# `in` operation
df[df['countries'].isin(c1)]
countries
1 UK
4 China
# `not in` operation
df[~df['countries'].isin(c1)]
countries
0 US
2 Germany
3 NaN
# Filter with `set` (tuples work too)
df[df['countries'].isin(c2)]
countries
2 Germany
# Filter with another Series
df[df['countries'].isin(c3)]
countries
0 US
4 China
# Filter with array
df[df['countries'].isin(c4)]
countries
0 US
1 UK
BİRÇOK Sütun Üzerine Filtre
Bazen, birden fazla sütun üzerinde bazı arama terimleriyle 'giriş' üyelik kontrolü uygulamak istersiniz,
df2 = pd.DataFrame({
'A': ['x', 'y', 'z', 'q'], 'B': ['w', 'a', np.nan, 'x'], 'C': np.arange(4)})
df2
A B C
0 x w 0
1 y a 1
2 z NaN 2
3 q x 3
c1 = ['x', 'w', 'p']
isinKoşulu "A" ve "B" sütunlarına uygulamak için şunu kullanın DataFrame.isin:
df2[['A', 'B']].isin(c1)
A B
0 True True
1 False False
2 False False
3 False True
Bundan, en az bir sütunun olduğu satırları tutmakTrueany için ilk eksen boyunca kullanabiliriz :
df2[['A', 'B']].isin(c1).any(axis=1)
0 True
1 False
2 False
3 True
dtype: bool
df2[df2[['A', 'B']].isin(c1).any(axis=1)]
A B C
0 x w 0
3 q x 3
Her sütunu aramak istiyorsanız, sütun seçimi adımını atlayıp
df2.isin(c1).any(axis=1)
Benzer şekilde, TÜM sütunların olduğu satırları tutmakTrueall için öncekiyle aynı şekilde kullanın .
df2[df2[['A', 'B']].isin(c1).all(axis=1)]
A B C
0 x w 0
Önemli Mentions: numpy.isin,, queryliste anlama (dize verileri)
Yöntemlere ilave edilmesi yukarıda açıklanan, aynı zamanda numpy eşdeğer kullanabilir: numpy.isin.
# `in` operation
df[np.isin(df['countries'], c1)]
countries
1 UK
4 China
# `not in` operation
df[np.isin(df['countries'], c1, invert=True)]
countries
0 US
2 Germany
3 NaN
Neden düşünmeye değer? NumPy işlevleri genellikle düşük ek yük nedeniyle panda eşdeğerlerinden biraz daha hızlıdır. Bu, dizin hizalamasına bağlı olmayan elementwise bir işlem olduğundan, bu yöntemin pandalar için uygun bir yedek olmadığı çok az durum vardırisin .
Dize ile çalışırken panda yordamları genellikle yinelemelidir, çünkü dize işlemlerini vektörlemek zordur. Burada liste kavrayışının daha hızlı olacağını gösteren çok sayıda kanıt var. . inŞimdi bir çek için başvuruyoruz .
c1_set = set(c1) # Using `in` with `sets` is a constant time operation...
# This doesn't matter for pandas because the implementation differs.
# `in` operation
df[[x in c1_set for x in df['countries']]]
countries
1 UK
4 China
# `not in` operation
df[[x not in c1_set for x in df['countries']]]
countries
0 US
2 Germany
3 NaN
Bununla birlikte, belirtmek çok daha kullanışsızdır, bu yüzden ne yaptığınızı bilmiyorsanız kullanmayın.
Son olarak, bu cevaptaDataFrame.query ele alınanlar da vardır . numexpr FTW!