Panda DataFrame için 'içeri' ve 'içeri' nasıl uygulanır?
Pandalar teklifler iki yöntem: Series.isin
ve DataFrame.isin
sırasıyla Serisi ve DataFrames için.
Bir Sütuna Dayalı DataFrame'i Filtrele (Seri için de geçerlidir)
En yaygın senaryo, isin
DataFrame'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']
isin
Koş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ı tutmakTrue
any
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ı tutmakTrue
all
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
,, query
liste 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!