Saya memiliki bingkai data dengan satu kolom dan saya ingin membaginya menjadi dua kolom, dengan satu tajuk kolom sebagai ' fips'
dan yang lainnya'row'
Kerangka data saya df
terlihat seperti ini:
row
0 00000 UNITED STATES
1 01000 ALABAMA
2 01001 Autauga County, AL
3 01003 Baldwin County, AL
4 01005 Barbour County, AL
Saya tidak tahu cara menggunakan df.row.str[:]
untuk mencapai tujuan saya untuk memisahkan sel baris. Saya dapat menggunakan df['fips'] = hello
untuk menambahkan kolom baru dan mengisinya hello
. Ada ide?
fips row
0 00000 UNITED STATES
1 01000 ALABAMA
2 01001 Autauga County, AL
3 01003 Baldwin County, AL
4 01005 Barbour County, AL
read_table()
atauread_fwf()
Jawaban:
Mungkin ada cara yang lebih baik, tapi ini satu pendekatan:
sumber
index = df.index
dan Anda baik.split
metode mengembalikan NaN dantolist
metode akan mengembalikan nilai ini sebagaimana adanya (NaN) yang akan menghasilkanValueError
(untuk mengatasi masalah ini Anda dapat melemparkannya ke tipe string sebelum membelah). Saya sarankan Anda untuk mencobanya sendiri. Ini cara belajar terbaik :-)df
memilikirow
tajuk kolom? Anda mungkin berpikir itu semacam atribut DataFrame tetapi cukup jelas ini adalah nama kolom. Terserah Anda bagaimana Anda membuat dan menentukan header kolom Anda jadi jika Anda menggunakan yang berbeda gunakan itu (misalnyadf.my_column_name.split(...)
)TL; versi DR:
Untuk kasus sederhana:
Solusi paling sederhana adalah:
Atau Anda dapat membuat membuat DataFrame dengan satu kolom untuk setiap entri pemisahan secara otomatis dengan:
Anda harus menggunakan
expand=True
jika string Anda memiliki jumlah split yang tidak seragam dan Anda inginNone
mengganti nilai yang hilang.Perhatikan bagaimana, dalam kedua kasus itu,
.tolist()
metode ini tidak perlu. Tidak jugazip()
.Secara terperinci:
Solusi Andy Hayden paling baik dalam menunjukkan kekuatan
str.extract()
metode ini.Tetapi untuk pemisahan sederhana di atas pemisah yang diketahui (seperti, membelah dengan garis, atau membelah dengan spasi),
.str.split()
metode ini cukup 1 . Ini beroperasi pada kolom (Seri) string, dan mengembalikan kolom (Seri) daftar:1: Jika Anda tidak yakin apa yang dilakukan dua parameter pertama
.str.split()
, saya merekomendasikan dokumen untuk versi metode Python sederhana .Tapi bagaimana cara Anda:
untuk:
Nah, kita perlu melihat lebih dekat
.str
atribut kolom.Ini adalah objek ajaib yang digunakan untuk mengumpulkan metode yang memperlakukan setiap elemen dalam kolom sebagai string, dan kemudian menerapkan metode masing-masing di setiap elemen seefisien mungkin:
Tetapi ia juga memiliki antarmuka "pengindeksan" untuk mendapatkan setiap elemen string dengan indeksnya:
Tentu saja, antarmuka pengindeksan
.str
ini tidak terlalu peduli jika setiap elemen yang diindeksinya sebenarnya adalah string, asalkan dapat diindeks, jadi:Kemudian, ini adalah masalah sederhana mengambil keuntungan dari tuple Python membongkar iterables untuk dilakukan
Tentu saja, mengeluarkan DataFrame dari pemisahan kolom string sangat berguna sehingga
.str.split()
metode ini dapat melakukannya untuk Anda denganexpand=True
parameter:Jadi, cara lain untuk mencapai apa yang kita inginkan adalah dengan melakukan:
The
expand=True
versi, meskipun lagi, memiliki keuntungan yang berbeda atas metode tupel membongkar. Tuple unpacking tidak cocok dengan pemisahan dengan panjang yang berbeda:Tetapi
expand=True
atasi dengan baik dengan menempatkanNone
di kolom yang tidak memiliki "pemisahan" yang cukup:sumber
.split()
metode yang menjelaskan dua parameter pertama lebih baik daripada dokumen Pandas.df.join(df['AB'].str.split('-', 1, expand=True).rename(columns={0:'A', 1:'B'}))
Anda dapat mengekstrak bagian-bagian yang berbeda dengan cukup rapi menggunakan pola regex:
Untuk menjelaskan regex yang agak panjang:
\d
) dan beri nama"fips"
.Bagian selanjutnya:
Apakah (
|
) salah satu dari dua hal:*
) dari huruf besar atau spasi ([A-Z ]
) dan beri nama ini"state"
sebelum akhir string ($
),atau
.*
) lalustate_code
sebelum akhir string ($
).Dalam contoh:
Perhatikan bahwa dua baris pertama menekan "negara" (meninggalkan NaN di kolom county dan state_code), sementara tiga baris terakhir menghantam county, state_code (meninggalkan NaN di kolom negara).
sumber
(?P<label>...)
sintaks! Saya tidak tahu mengapa saya menggunakan regex yang lebih kompleks, jelas yang sederhana bisa berfungsi hmmmm<group_name>
. Sekarang saya tahu itu membuat kode saya sangat ringkas.sumber
Jika Anda tidak ingin membuat kerangka data baru, atau jika kerangka data Anda memiliki lebih banyak kolom daripada yang ingin Anda bagi, Anda dapat:
sumber
zip argument #1 must support iteration
kesalahan, python 2.7Anda dapat menggunakan
str.split
dengan spasi putih (pemisah default) dan parameterexpand=True
untukDataFrame
dengan menetapkan ke kolom baru:Modifikasi jika perlu menghapus kolom asli dengan
DataFrame.pop
Seperti apa itu:
Jika mendapatkan kesalahan:
Anda dapat memeriksa dan mengembalikan 4 kolom
DataFrame
, tidak hanya 2:Maka solusi ditambahkan baru
DataFrame
denganjoin
:Dengan menghapus kolom asli (jika ada juga kolom lain):
sumber
Jika Anda ingin membagi string menjadi lebih dari dua kolom berdasarkan pembatas, Anda dapat menghilangkan parameter 'pemisahan maksimum'.
Kamu bisa memakai:
Ini akan secara otomatis membuat kolom sebanyak jumlah bidang maksimum yang termasuk dalam salah satu string awal Anda.
sumber
Terkejut saya belum melihat yang satu ini. Jika Anda hanya perlu dua split, saya sangat merekomendasikan. . .
Series.str.partition
partition
melakukan satu split pada separator, dan umumnya cukup performant.Jika Anda perlu mengganti nama baris,
Jika Anda perlu menggabungkan ini kembali ke aslinya, gunakan
join
atauconcat
:sumber
Saya lebih suka mengekspor seri panda yang sesuai (yaitu kolom yang saya butuhkan), menggunakan fungsi yang berlaku untuk membagi konten kolom menjadi beberapa seri dan kemudian bergabung dengan kolom yang dihasilkan ke DataFrame yang ada. Tentu saja, kolom sumber harus dihapus.
misalnya
Untuk membagi dua kata fungsi string harus seperti itu:
sumber
Saya melihat bahwa tidak ada yang menggunakan metode slice, jadi di sini saya meletakkan 2 sen saya di sini.
Metode ini akan membuat dua kolom baru.
sumber
Gunakan
df.assign
untuk membuat df baru. Lihat http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copysumber