Saya memiliki DataFrame:
import pandas as pd
import numpy as np
df = pd.DataFrame({'foo.aa': [1, 2.1, np.nan, 4.7, 5.6, 6.8],
'foo.fighters': [0, 1, np.nan, 0, 0, 0],
'foo.bars': [0, 0, 0, 0, 0, 1],
'bar.baz': [5, 5, 6, 5, 5.6, 6.8],
'foo.fox': [2, 4, 1, 0, 0, 5],
'nas.foo': ['NA', 0, 1, 0, 0, 0],
'foo.manchu': ['NA', 0, 0, 0, 0, 0],})
Saya ingin memilih nilai 1 di kolom yang dimulai dengan foo.
. Apakah ada cara yang lebih baik untuk melakukannya selain:
df2 = df[(df['foo.aa'] == 1)|
(df['foo.fighters'] == 1)|
(df['foo.bars'] == 1)|
(df['foo.fox'] == 1)|
(df['foo.manchu'] == 1)
]
Sesuatu yang mirip dengan menulis sesuatu seperti:
df2= df[df.STARTS_WITH_FOO == 1]
Jawabannya harus mencetak DataFrame seperti ini:
bar.baz foo.aa foo.bars foo.fighters foo.fox foo.manchu nas.foo
0 5.0 1.0 0 0 2 NA NA
1 5.0 2.1 0 1 4 0 0
2 6.0 NaN 0 NaN 1 0 1
5 6.8 6.8 1 0 5 0 0
[4 rows x 7 columns]
Cara termudah adalah dengan menggunakan str langsung pada nama kolom, tidak perlu
pd.Series
sumber
Berdasarkan jawaban @ EdChum, Anda dapat mencoba solusi berikut:
Ini akan sangat membantu jika tidak semua kolom yang ingin Anda pilih dimulai
foo
. Metode ini memilih semua kolom yang berisi substringfoo
dan dapat ditempatkan di titik mana pun dari nama kolom.Intinya, saya ganti
.startswith()
dengan.contains()
.sumber
Solusi saya. Mungkin lebih lambat pada kinerja:
sumber
Pilihan lain untuk pemilihan entri yang diinginkan adalah dengan menggunakan
map
:yang memberi Anda semua kolom untuk baris yang berisi
1
:Pemilihan baris dilakukan oleh
seperti dalam jawaban @ ajcr yang memberi Anda:
artinya baris tersebut
3
dan4
tidak mengandung a1
dan tidak akan dipilih.The pemilihan kolom dilakukan dengan menggunakan pengindeksan Boolean seperti ini:
Dalam contoh di atas, ini mengembalikan
Jadi, jika kolom tidak dimulai dengan
foo
,False
dikembalikan dan karena itu kolom tidak dipilih.Jika Anda hanya ingin mengembalikan semua baris yang berisi
1
- seperti yang disarankan keluaran yang Anda inginkan - Anda dapat melakukannyayang kembali
sumber
Anda dapat mencoba regex di sini untuk memfilter kolom yang dimulai dengan "foo"
df.filter(regex='^foo*')
Jika Anda perlu memiliki string foo di kolom Anda, maka
df.filter(regex='foo*')
akan sesuai.
Untuk langkah selanjutnya, Anda bisa menggunakan
df[df.filter(regex='^foo*').values==1]
untuk menyaring baris yang salah satu nilai kolom 'foo *' adalah 1.
sumber
Dalam kasus saya, saya membutuhkan daftar prefiks
sumber