Saya ingin mengatur dtype
s dari beberapa kolom di pd.Dataframe
(Saya memiliki file yang harus saya parse secara manual ke dalam daftar daftar, karena file tersebut tidak dapat menerima pd.read_csv
)
import pandas as pd
print pd.DataFrame([['a','1'],['b','2']],
dtype={'x':'object','y':'int'},
columns=['x','y'])
saya mendapat
ValueError: entry not a 2- or 3- tuple
Satu-satunya cara saya dapat mengaturnya adalah dengan mengulang setiap variabel kolom dan menyusunnya kembali astype
.
dtypes = {'x':'object','y':'int'}
mydata = pd.DataFrame([['a','1'],['b','2']],
columns=['x','y'])
for c in mydata.columns:
mydata[c] = mydata[c].astype(dtypes[c])
print mydata['y'].dtype #=> int64
Apakah ada cara yang lebih baik?
df = pd.DataFrame([['a','1'],['b','2']], dtype='int', columns=['x','y'])
"bekerja" ... tetapi: sJawaban:
Sejak 0.17, Anda harus menggunakan konversi eksplisit:
(Seperti yang disebutkan di bawah, tidak ada lagi "sihir",
convert_objects
tidak digunakan lagi di 0.17)Anda dapat menerapkan ini ke setiap kolom yang ingin Anda konversi:
dan pastikan dtype diperbarui.
JAWABAN LAMA / TIDAK BERLAKU untuk panda 0.12 - 0.16: Anda dapat menggunakan
convert_objects
untuk menyimpulkan tipe yang lebih baik:Sihir! (Sedih melihat itu ditinggalkan.)
sumber
type.convert
di R sedikit; bagus tetapi meninggalkan orang yang menginginkan spesifikasi eksplisit dalam beberapa kasus.convert_objects()
sudah usang ... saya tidak yakin apa yang menggantikannya?Untuk yang datang dari Google (dll.) Seperti saya:
convert_objects
sudah tidak digunakan lagi sejak 0.17 - jika Anda menggunakannya, Anda akan mendapatkan peringatan seperti ini:Anda harus melakukan sesuatu seperti berikut:
df =
df.astype(np.float)
df["A"] =
pd.to_numeric(df["A"])
sumber
pd.to_datetime, to_timedelta, to_numeric
ini seharusnya jawaban yang diterima.Anda dapat menyetel tipe secara eksplisit dengan panda
DataFrame.astype(dtype, copy=True, raise_on_error=True, **kwargs)
dan memasukkan kamus dengan dtypes yang Anda inginkandtype
inilah contohnya:
sekarang Anda dapat melihat bahwa itu berubah
sumber
Cara lain untuk menyetel tipe kolom adalah dengan membuat larik record numpy dengan tipe yang Anda inginkan, mengisinya, lalu meneruskannya ke konstruktor DataFrame.
sumber
menghadapi masalah yang sama denganmu. Dalam kasus saya, saya memiliki 1000 file dari log cisco yang perlu saya parse secara manual.
Agar fleksibel dengan bidang dan tipe, saya telah berhasil menguji menggunakan StringIO + read_cvs yang memang menerima dikt untuk spesifikasi dtype.
Saya biasanya mendapatkan setiap file (5k-20k baris) ke dalam buffer dan membuat kamus dtype secara dinamis.
Akhirnya saya menggabungkan (dengan kategoris ... terima kasih kepada 0.19) dataframe ini ke dalam bingkai data besar yang saya buang ke hdf5.
Sesuatu di sepanjang garis ini
Tidak terlalu pythonic .... tetapi melakukan pekerjaan itu
Semoga membantu.
JC
sumber
Anda lebih baik menggunakan np.arrays yang diketik, lalu meneruskan data dan nama kolom sebagai kamus.
sumber