Bagaimana cara menerapkan 'dalam' dan 'tidak dalam' untuk DataFrame panda?
Penawaran panda dua metode: Series.isin
dan DataFrame.isin
untuk Seri dan DataFrames, masing-masing.
Filter DataFrame Berdasarkan pada ONE Column (juga berlaku untuk Seri)
Skenario yang paling umum adalah menerapkan isin
kondisi pada kolom tertentu untuk memfilter baris dalam DataFrame.
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
menerima berbagai jenis sebagai input. Berikut ini adalah semua cara yang sah untuk mendapatkan yang Anda inginkan:
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
Filter pada BANYAK Kolom
Terkadang, Anda ingin menerapkan cek keanggotaan 'dalam' dengan beberapa istilah pencarian di beberapa kolom,
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']
Untuk menerapkan isin
kondisi pada kedua kolom "A" dan "B", gunakan DataFrame.isin
:
df2[['A', 'B']].isin(c1)
A B
0 True True
1 False False
2 False False
3 False True
Dari ini, untuk mempertahankan baris di mana setidaknya satu kolom beradaTrue
, kita dapat menggunakan any
sepanjang sumbu pertama:
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
Perhatikan bahwa jika Anda ingin mencari setiap kolom, Anda cukup menghilangkan langkah pemilihan kolom dan lakukan
df2.isin(c1).any(axis=1)
Demikian pula, untuk mempertahankan baris di mana SEMUA kolom beradaTrue
, gunakan all
dengan cara yang sama seperti sebelumnya.
df2[df2[['A', 'B']].isin(c1).all(axis=1)]
A B C
0 x w 0
Terkemuka Mention: numpy.isin
, query
, daftar comprehensions (data string)
Selain metode yang dijelaskan di atas, Anda juga dapat menggunakan numpy setara: 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
Mengapa itu layak dipertimbangkan? Fungsi NumPy biasanya sedikit lebih cepat daripada panda yang setara karena overhead yang lebih rendah. Karena ini adalah operasi elementwise yang tidak bergantung pada penyelarasan indeks, ada beberapa situasi di mana metode ini bukan pengganti yang tepat untuk panda 'isin
.
Rutinitas panda biasanya berulang saat bekerja dengan string, karena operasi string sulit untuk vectorise. Ada banyak bukti yang menunjukkan bahwa pemahaman daftar akan lebih cepat di sini. . Kami menggunakan in
cek sekarang.
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
Namun, jauh lebih sulit untuk ditentukan, jadi jangan menggunakannya kecuali Anda tahu apa yang Anda lakukan.
Terakhir, ada juga DataFrame.query
yang telah dibahas dalam jawaban ini . numexpr FTW!