Saya ingin menambahkan string ke awal setiap nilai di kolom kata dari bingkai data panda (dengan elegan). Saya sudah menemukan cara untuk melakukan ini dan saat ini saya menggunakan:
df.ix[(df['col'] != False), 'col'] = 'str'+df[(df['col'] != False), 'col']
Ini sepertinya hal yang sangat tidak elegan untuk dilakukan - apakah Anda tahu cara lain (yang mungkin juga menambahkan karakter ke baris di mana kolom itu adalah 0 atau NaN)?
Jika ini masih belum jelas, saya ingin membalik:
col
1 a
2 0
ke:
col
1 stra
2 str0
!= False
bisnis ini? Apakah Anda ingin menambahstr
setiap nilai atau hanya beberapa?df['col'] = 'str' + df['col'].astype(str)
?Jawaban:
Contoh:
sumber
Sebagai alternatif, Anda juga dapat menggunakan
apply
kombinasi denganformat
(atau lebih baik dengan f-string) yang menurut saya sedikit lebih mudah dibaca jika salah satu misalnya ingin menambahkan sufiks atau memanipulasi elemen itu sendiri:yang juga menghasilkan keluaran yang diinginkan:
Jika Anda menggunakan Python 3.6+, Anda juga dapat menggunakan f-string:
menghasilkan keluaran yang sama.
Versi f-string hampir secepat solusi @ RomanPekar (python 3.6.4):
Menggunakan
format
, bagaimanapun, memang jauh lebih lambat:sumber
format
memang berkinerja lebih buruk. Bagaimana Anda membandingkan?.apply
selalu lebih cepat atau lebih lambat daripada operasi vektor "langsung"; bahkan jika tidak lebih lambat, saya lebih suka menghindarinya jika memungkinkan.x
sendirinya, dll., Tetapi itu hanya masalah selera ... :)Anda dapat menggunakan pandas.Series.map:
Ini akan menerapkan kata "str" sebelum semua nilai Anda.
sumber
Jika Anda memuat file tabel Anda
dtype=str
atau mengonversi jenis kolom menjadi string
df['a'] = df['a'].astype(str)
maka Anda dapat menggunakan pendekatan seperti itu:
Pendekatan ini memungkinkan string tambahan, penambahan, dan subset dari
df
.Bekerja pada Pandas v0.23.4, v0.24.1. Tidak tahu tentang versi sebelumnya.
sumber
Solusi lain dengan .loc:
Ini tidak secepat solusi di atas (> 1ms per loop lebih lambat) tetapi mungkin berguna jika Anda membutuhkan perubahan bersyarat, seperti:
sumber
.index
masukdf[mask].index
?df.loc[mask]
berhasil, dan berhasil, maka itu tidak.index
berguna, bukan?