Saya perlu menggunakan fungsi yang berbeda untuk menangani kolom numerik dan kolom string. Apa yang saya lakukan sekarang benar-benar bodoh:
allc = list((agg.loc[:, (agg.dtypes==np.float64)|(agg.dtypes==np.int)]).columns)
for y in allc:
treat_numeric(agg[y])
allc = list((agg.loc[:, (agg.dtypes!=np.float64)&(agg.dtypes!=np.int)]).columns)
for y in allc:
treat_str(agg[y])
Apakah ada cara yang lebih elegan untuk melakukan ini? Misalnya
for y in agg.columns:
if(dtype(agg[y]) == 'string'):
treat_str(agg[y])
elif(dtype(agg[y]) != 'string'):
treat_numeric(agg[y])
string
bukan dtypeJawaban:
Anda dapat mengakses tipe data kolom dengan
dtype
:sumber
treat_numeric
. Karena dia dimasukkanagg.dtypes==np.float64
sebagai opsi, saya juga melakukannya.number
sini: docs.scipy.org/doc/numpy-1.13.0/reference/arrays.scalars.html Solusi umumnya adalahis_numeric_dtype(agg[y])
Dalam
pandas 0.20.2
Anda dapat melakukan:Jadi kode Anda menjadi:
sumber
pandas.core.common.is_numeric_dtype
telah ada sejak Pandas 0.13, dan itu melakukan hal yang sama, tapi saya rasa sudah usang dan mendukungpandas.api.types.is_numeric_dtype
di 0.19, saya pikirSaya tahu ini sedikit dari utas lama tetapi dengan panda 19.02, Anda dapat melakukan:
http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.DataFrame.select_dtypes.html
sumber
include[np.number]
(untuk juga memasukkan int dan 32 bit float) untuk baris pertama danexclude[object]
baris kedua. String adalah objek sejauh dtypes diperhatikan. Faktanya, memasukkan 'string' dengan objek memberi saya kesalahan.'period'
dtype meningkatNotImplementedError
untuk saat ini (pandas 0.24.2). Jadi seseorang mungkin membutuhkan beberapa pemrosesan pos buatan tangan.Judul pertanyaan yang ditanyakan bersifat umum, tetapi kasus penggunaan penulis yang tertera di badan pertanyaan bersifat spesifik. Jadi jawaban lain dapat digunakan.
Tetapi untuk sepenuhnya menjawab pertanyaan judul , harus diklarifikasi bahwa tampaknya semua pendekatan mungkin gagal dalam beberapa kasus dan memerlukan beberapa pengerjaan ulang. Saya meninjau semuanya (dan beberapa tambahan) dalam penurunan urutan keandalan (menurut saya):
1. Membandingkan tipe secara langsung melalui
==
(jawaban yang diterima).Terlepas dari kenyataan bahwa ini adalah jawaban yang diterima dan memiliki jumlah suara positif terbanyak, saya pikir metode ini tidak boleh digunakan sama sekali. Karena sebenarnya pendekatan ini tidak dianjurkan pada python seperti yang disebutkan beberapa kali di sini .
Tetapi jika salah satu masih ingin menggunakannya - harus menyadari beberapa dtypes panda-spesifik seperti
pd.CategoricalDType
,pd.PeriodDtype
, ataupd.IntervalDtype
. Di sini seseorang harus menggunakan ekstratype( )
untuk mengenali dtype dengan benar:Peringatan lain di sini adalah jenis itu harus ditunjukkan dengan tepat:
2.
isinstance()
pendekatan.Metode ini belum disebutkan dalam jawaban sejauh ini.
Jadi jika membandingkan tipe secara langsung bukanlah ide yang baik - mari coba fungsi python built-in untuk tujuan ini, yaitu -
isinstance()
.Ini gagal hanya pada awalnya, karena mengasumsikan bahwa kita memiliki beberapa objek, tetapi
pd.Series
ataupd.DataFrame
dapat digunakan hanya sebagai wadah kosong dengan yang telah ditentukandtype
tetapi tidak ada objek di dalamnya:Tetapi jika seseorang mengatasi masalah ini, dan ingin mengakses setiap objek, misalnya, di baris pertama dan memeriksa dtype-nya seperti itu:
Ini akan menyesatkan dalam kasus jenis data campuran dalam satu kolom:
Dan yang tak kalah pentingnya - metode ini tidak dapat langsung mengenali
Category
dtype. Seperti yang dinyatakan dalam dokumen :Jadi metode ini juga hampir tidak bisa diterapkan.
3.
df.dtype.kind
pendekatan.Metode ini mungkin berfungsi dengan kosong
pd.Series
ataupd.DataFrames
tetapi memiliki masalah lain.Pertama - tidak dapat membedakan beberapa tipe dt:
Kedua, apa yang sebenarnya masih belum jelas bagi saya, bahkan mengembalikan beberapa dtypes None .
4.
df.select_dtypes
pendekatan.Ini hampir seperti yang kita inginkan. Metode ini dirancang di dalam pandas sehingga menangani sebagian besar kasus sudut yang disebutkan sebelumnya - DataFrames kosong, berbeda dengan baik jenis dtype numpy atau pandas tertentu. Ia bekerja dengan baik dengan tipe dtype tunggal seperti
.select_dtypes('bool')
. Ini dapat digunakan bahkan untuk memilih kelompok kolom berdasarkan dtype:Seperti itu, seperti yang dinyatakan dalam dokumen :
Pada mungkin berpikir bahwa di sini kita melihat hasil tak terduga pertama (dulu bagi saya: pertanyaan ) -
TimeDelta
dimasukkan ke dalam outputDataFrame
. Tetapi seperti yang dijawab sebaliknya, seharusnya demikian, tetapi orang harus menyadarinya. Perhatikan bahwabool
dtype dilewati, yang mungkin juga tidak diinginkan oleh seseorang, tetapi hal itu disebabkanbool
dannumber
berada dalam " subpohon " yang berbeda dari dtypes numpy. Dalam kasus dengan bool, kami dapat menggunakan ditest.select_dtypes(['bool'])
sini.Batasan selanjutnya dari metode ini adalah untuk versi panda saat ini (0.24.2), kode ini:
test.select_dtypes('period')
akan munculNotImplementedError
.Dan hal lainnya adalah ia tidak dapat membedakan string dari objek lain:
Tapi ini, pertama - sudah disebutkan di dokumen. Dan kedua - bukan masalah metode ini, melainkan cara string disimpan
DataFrame
. Tapi bagaimanapun kasus ini harus memiliki beberapa proses pasca.5.
df.api.types.is_XXX_dtype
pendekatan.Yang ini dimaksudkan untuk menjadi cara yang paling kuat dan asli untuk mencapai pengenalan dtype (jalur modul tempat fungsi berada mengatakan dengan sendirinya) seperti yang saya kira. Dan itu bekerja hampir sempurna, tetapi masih memiliki setidaknya satu peringatan dan masih harus membedakan kolom string .
Selain itu, ini mungkin subjektif, tetapi pendekatan ini juga memiliki
number
pemrosesan kelompok tipe yang lebih 'dapat dimengerti manusia' dibandingkan dengan.select_dtypes('number')
:Tidak
timedelta
danbool
disertakan. Sempurna.Pipeline saya mengeksploitasi fungsi ini dengan tepat pada saat ini, ditambah sedikit pemrosesan pasca tangan.
Keluaran.
Harapan saya dapat menjelaskan poin utama - bahwa semua pendekatan yang dibahas dapat digunakan, tetapi hanya
pd.DataFrame.select_dtypes()
danpd.api.types.is_XXX_dtype
harus benar-benar dianggap sebagai pendekatan yang dapat diterapkan.sumber
Jika Anda ingin menandai tipe kolom dataframe sebagai string, Anda dapat melakukan:
Sebuah contoh:
Jawaban untuk kode Anda:
sumber
Untuk cukup mencetak tipe data kolom
Untuk memeriksa tipe data setelah, misalnya, impor dari file
Keluaran ilustratif:
sumber