Saya ingin menemukan semua nilai dalam kerangka data Pandas yang berisi spasi putih (jumlah sembarang) dan mengganti nilai-nilai itu dengan NaNs.
Adakah ide bagaimana hal ini dapat diperbaiki?
Pada dasarnya saya ingin mengubah ini:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz
2000-01-05 -0.222552 4
2000-01-06 -1.176781 qux
Ke dalam ini:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz NaN
2000-01-05 -0.222552 NaN 4
2000-01-06 -1.176781 qux NaN
Saya sudah berhasil melakukannya dengan kode di bawah ini, tetapi manusia itu jelek. Ini bukan Pythonic dan saya yakin itu bukan penggunaan panda yang paling efisien juga. Saya loop melalui setiap kolom dan melakukan penggantian boolean terhadap topeng kolom yang dihasilkan dengan menerapkan fungsi yang melakukan pencarian regex dari setiap nilai, cocok dengan spasi putih.
for i in df.columns:
df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None
Itu bisa sedikit dioptimalkan dengan hanya mengulangi bidang yang bisa berisi string kosong:
if df[i].dtype == np.dtype('object')
Tapi itu tidak banyak perbaikan
Dan akhirnya, kode ini menetapkan string target ke Tidak ada, yang berfungsi dengan fungsi Pandas seperti fillna()
, tetapi akan lebih baik untuk kelengkapan jika saya benar-benar dapat memasukkan secara NaN
langsung, bukan None
.
replace
dengan regex ... (mungkin ini harus diminta sebagai fitur).Jawaban:
Saya pikir berhasil
df.replace()
, karena panda 0.13 :Menghasilkan:
Seperti yang ditunjukkan oleh Temak , gunakan
df.replace(r'^\s+$', np.nan, regex=True)
jika data valid Anda berisi spasi putih.sumber
pd.Series(["1", "#", "9", " .", None]).replace(r"( +\.)|#", "X", regex=True).values
yang memberi['1', 'X', '9', 'X', None]
df.replace(r'^\s+$', np.nan, regex=True)
Jika Anda ingin mengganti string kosong dan catatan dengan spasi saja, jawaban yang benar adalah ::
Jawaban yang diterima
Tidak mengganti string kosong !, Anda dapat mencoba sendiri dengan contoh yang diberikan yang sedikit diperbarui:
Perhatikan, juga bahwa 'untuk' tidak diganti dengan Nan, meskipun mengandung spasi. Catatan selanjutnya, bahwa sederhana:
Juga tidak berhasil - coba saja.
sumber
Bagaimana tentang:
The
applymap
Fungsi berlaku fungsi untuk setiap sel dataframe tersebut.sumber
isinstance
akan sedikit lebih cepat.''
. Untuk mempertimbangkan juga string kosong, gunakan:d = d.applymap(lambda x: np.nan if isinstance(x, basestring) and (not x or x.isspace()) else x)
Saya akan melakukan ini:
atau
Anda dapat menghapus semua str, lalu ganti str kosong dengan
np.nan
.sumber
Sederhana dari semua solusi:
sumber
Jika Anda mengekspor data dari file CSV, sesederhana ini:
Ini akan membuat bingkai data serta mengganti nilai kosong sebagai Na
sumber
skipinitialspace=True
juga menghilangkan spasi putih setelah pembatas yang akan menyebabkan spasi putih, string kosong dibaca sebagainan
. Namun jika Anda ingin mempertahankan ruang awal untuk alasan apa pun maka opsi ini bukan pilihan yang baik.Untuk solusi yang sangat cepat dan sederhana di mana Anda memeriksa kesetaraan terhadap nilai tunggal, Anda dapat menggunakan
mask
metode ini.sumber
Ini semua dekat dengan jawaban yang benar, tetapi saya tidak akan mengatakan ada memecahkan masalah sambil tetap paling mudah dibaca oleh orang lain membaca kode Anda. Saya akan mengatakan bahwa jawaban itu adalah kombinasi dari Jawaban BrenBarn dan komentar tuomasttik di bawah jawaban itu . Jawaban BrenBarn menggunakan
isspace
builtin, tetapi tidak mendukung penghapusan string kosong, seperti yang diminta OP, dan saya akan cenderung menganggapnya sebagai kasus penggunaan standar untuk mengganti string dengan null.Saya menulis ulang dengan
.apply
, sehingga Anda dapat menyebutnya dipd.Series
ataupd.DataFrame
.Python 3:
Untuk mengganti string kosong atau string dari seluruh ruang:
Untuk mengganti string seluruh ruang:
Untuk menggunakan ini di Python 2, Anda harus menggantinya
str
denganbasestring
.Python 2:
Untuk mengganti string kosong atau string dari seluruh ruang:
Untuk mengganti string seluruh ruang:
sumber
Ini berhasil untuk saya. Ketika saya mengimpor file csv saya, saya menambahkan na_values = ''. Spasi tidak termasuk dalam nilai NaN default.
df = pd.read_csv (filepath, na_values = '')
sumber
Anda juga dapat menggunakan filter untuk melakukannya.
sumber
sumber
Ini bukan solusi yang elegan, tetapi yang tampaknya berhasil adalah menabung ke XLSX dan kemudian mengimpornya kembali. Solusi lain di halaman ini tidak berhasil untuk saya, tidak yakin mengapa.
sumber