Saya memiliki 20 x 4000 dataframe di Python menggunakan panda. Dua kolom ini diberi nama Year
dan quarter
. Saya ingin membuat variabel bernama period
make Year = 2000
and quarter= q2
into 2000q2
.
Adakah yang bisa membantu dengan itu?
jika kedua kolom adalah string, Anda dapat menggabungkannya secara langsung:
df["period"] = df["Year"] + df["quarter"]
Jika salah satu (atau keduanya) dari kolom tidak diketik string, Anda harus mengubahnya terlebih dahulu,
df["period"] = df["Year"].astype(str) + df["quarter"]
Jika Anda harus bergabung dengan beberapa kolom string, Anda dapat menggunakan agg
:
df['period'] = df[['Year', 'quarter', ...]].agg('-'.join, axis=1)
Di mana "-" adalah pemisah.
add(dataframe.iloc[:, 0:10])
misalnya?sum
.dataframe["period"] = dataframe["Year"].map(str) + dataframe["quarter"].map(str)
peta hanya menerapkan konversi string ke semua entri.Menghasilkan kerangka data ini
Metode ini menggeneralisasi ke jumlah kolom string yang sewenang-wenang dengan mengganti
df[['Year', 'quarter']]
dengan setiap potongan kolom dari kerangka data Anda, misalnyadf.iloc[:,0:2].apply(lambda x: ''.join(x), axis=1)
.Anda dapat memeriksa informasi lebih lanjut tentang metode apply () di sini
sumber
lambda x: ''.join(x)
hanya saja''.join
, bukan?lambda x: ''.join(x)
konstruksi tidak melakukan apa-apa; itu seperti menggunakanlambda x: sum(x)
bukan hanyasum
.''.join
, yaitu:df['period'] = df[['Year', 'quarter']].apply(''.join, axis=1)
.join
hanya mengambilstr
contoh dalam iterable. Gunakanmap
untuk mengonversikan semuanya menjadistr
dan kemudian gunakanjoin
.Kumpulan data kecil (<150 baris)
atau sedikit lebih lambat tetapi lebih kompak:
Kumpulan data yang lebih besar (> 150 baris)
UPDATE: Grafik waktu Pandas 0.23.4
Mari kita uji pada 200K baris DF:
MEMPERBARUI: timing baru menggunakan Pandas 0.19.0
Pengaturan waktu tanpa pengoptimalan CPU / GPU (diurutkan dari yang tercepat ke yang paling lambat):
Pengaturan waktu menggunakan pengoptimalan CPU / GPU:
Jawab kontribusi oleh @ anton-vbr
sumber
df.T.apply(lambda x: x.str.cat(sep=''))
Metode
cat()
dari.str
accessor bekerja dengan sangat baik untuk ini:cat()
bahkan memungkinkan Anda untuk menambahkan pemisah jadi, misalnya, misalkan Anda hanya memiliki bilangan bulat untuk tahun dan periode, Anda dapat melakukan ini:Bergabung dengan banyak kolom hanyalah masalah meneruskan daftar seri atau bingkai data yang berisi semua kecuali kolom pertama sebagai parameter untuk
str.cat()
dipanggil pada kolom pertama (Seri):Perhatikan bahwa jika bingkai / seri data panda Anda memiliki nilai nol, Anda harus menyertakan parameter na_rep untuk mengganti nilai NaN dengan string, jika tidak, kolom gabungan akan default ke NaN.
sumber
lambda
ataumap
; juga hanya terbaca paling bersih.str.cat()
. Saya akan mengubah jawabannyasep
kata kunci? dalam panda-0.23.4. Terima kasih!sep
parameter hanya diperlukan jika Anda berniat untuk memisahkan bagian-bagian dari string bersambung. Jika Anda mendapatkan kesalahan, tolong tunjukkan kepada kami contoh Anda yang gagal.Penggunaan fungsi lamba kali ini dengan string.format ().
Ini memungkinkan Anda untuk bekerja dengan nilai-nilai non-string dan memformat ulang sesuai kebutuhan.
sumber
sumber
Year
bukan stringdf['Year'].astype(str) + '' + df['quarter'].astype(str)
Meskipun jawaban @silvado baik jika Anda mengubah
df.map(str)
untukdf.astype(str)
itu akan lebih cepat:sumber
Mari kita misalkan Anda
dataframe
yaitudf
dengan kolomYear
danQuarter
.Misalkan kita ingin melihat kerangka data;
Akhirnya, gabungkan
Year
danQuarter
sebagai berikut.Anda sekarang
print
df
dapat melihat kerangka data yang dihasilkan.Jika Anda tidak ingin ruang antara tahun dan kuartal, cukup hapus dengan melakukan;
sumber
df['Period'] = df['Year'].map(str) + df['Quarter'].map(str)
TypeError: Series cannot perform the operation +
ketika saya menjalankan salah satudf2['filename'] = df2['job_number'] + '.' + df2['task_number']
ataudf2['filename'] = df2['job_number'].map(str) + '.' + df2['task_number'].map(str)
.df2['filename'] = df2['job_number'].astype(str) + '.' + df2['task_number'].astype(str)
berhasil.dataframe
yang saya buat di atas, Anda akan melihat bahwa semua kolom adalahstring
s.Berikut ini adalah implementasi yang menurut saya sangat serbaguna:
sumber
Saat data Anda dimasukkan ke dalam kerangka data, perintah ini akan menyelesaikan masalah Anda:
sumber
lebih efisien
dan ini adalah tes waktu:
final, ketika
sum
(concat_df_str2) digunakan, hasilnya tidak hanya concat, itu akan ditransformasikan ke integer.sumber
df.values[:, 0:3]
ataudf.values[:, [0,2]]
.generalisasi ke beberapa kolom, mengapa tidak:
sumber
Menggunakan
zip
bisa lebih cepat:Grafik:
sumber
Solusi paling sederhana:
Solusi Umum
Solusi khusus pertanyaan
sumber
Solusi ini menggunakan langkah menengah mengompresi dua kolom DataFrame ke satu kolom yang berisi daftar nilai. Ini berfungsi tidak hanya untuk string tetapi untuk semua jenis kolom-dtypes
Hasil:
sumber
Seperti banyak yang telah disebutkan sebelumnya, Anda harus mengubah setiap kolom menjadi string dan kemudian menggunakan operator plus untuk menggabungkan dua kolom string. Anda bisa mendapatkan peningkatan kinerja besar dengan menggunakan NumPy.
sumber
df2['filename'] = df2['job_number'].values.astype(str) + '.' + df2['task_number'].values.astype(str)
-> Keluaran :TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U21') dtype('<U21') dtype('<U21')
. Baik job_number dan task_number adalah int.df['Year'].values.astype(str) + df.quarter
Saya pikir cara terbaik untuk menggabungkan kolom dalam panda adalah dengan mengubah kedua kolom menjadi integer dan kemudian ke str.
sumber
Berikut ini adalah ringkasan saya dari solusi di atas untuk menggabungkan / menggabungkan dua kolom dengan nilai int dan str ke dalam kolom baru, menggunakan pemisah antara nilai kolom. Tiga solusi berfungsi untuk tujuan ini.
sumber
Gunakan
.combine_first
.sumber
.combine_first
akan menghasilkan nilai dari'Year'
disimpan di'Period'
, atau, jika Null, nilai dari'Quarter'
. Itu tidak akan menyatukan dua string dan menyimpannya'Period'
.Sebagai contoh:
sumber
Seseorang dapat menggunakan metode assign dari DataFrame :
sumber
atau jika nilainya seperti [2000] [4] dan ingin membuat [2000q4]
menggantikan
.astype(str)
dengan.map(str)
karya juga.sumber