日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pandas category数据类型

發布時間:2023/12/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pandas category数据类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

pandas category數據類型

  • 實際應用pandas過程中,經常會用到category數據類型,通常以string的形式顯示,包括顏色(紅,綠,藍),尺寸的大小(大,中,小),還有地理信息等(國家,省份),這些數據的處理經常會有各種各樣的問題,pandas以及scikit-learn兩個包可以將category數據轉化為合適的數值型格式,這篇主要介紹通過這兩個包處理category類型的數據轉化為數值類型,也就是encoding的過程。
  • 數據來源UCI Machine Learning Repository,這個數據集中包含了很多的category類型的數據,可以從鏈接匯總查看數據的代表的含義。
  • 下面開始導入需要用到的包
import numpy as np import pandas as pd # 規定一下數據列的各個名稱, headers = ["symboling", "normalized_losses", "make", "fuel_type", "aspiration","num_doors", "body_style", "drive_wheels", "engine_location","wheel_base", "length", "width", "height", "curb_weight","engine_type", "num_cylinders", "engine_size", "fuel_system","bore", "stroke", "compression_ratio", "horsepower", "peak_rpm","city_mpg", "highway_mpg", "price"] # 從pandas導入csv文件,將?標記為NaN缺失值 df=pd.read_csv("http://mlr.cs.umass.edu/ml/machine-learning-databases/autos/imports-85.data",header=None,names=headers,na_values="?") df.head() symbolingnormalized_lossesmakefuel_typeaspirationnum_doorsbody_styledrive_wheelsengine_locationwheel_base...engine_sizefuel_systemborestrokecompression_ratiohorsepowerpeak_rpmcity_mpghighway_mpgprice01234
3NaNalfa-romerogasstdtwoconvertiblerwdfront88.6...130mpfi3.472.689.0111.05000.0212713495.0
3NaNalfa-romerogasstdtwoconvertiblerwdfront88.6...130mpfi3.472.689.0111.05000.0212716500.0
1NaNalfa-romerogasstdtwohatchbackrwdfront94.5...152mpfi2.683.479.0154.05000.0192616500.0
2164.0audigasstdfoursedanfwdfront99.8...109mpfi3.193.4010.0102.05500.0243013950.0
2164.0audigasstdfoursedan4wdfront99.4...136mpfi3.193.408.0115.05500.0182217450.0

5 rows × 26 columns

df.dtypes symboling int64 normalized_losses float64 make object fuel_type object aspiration object num_doors object body_style object drive_wheels object engine_location object wheel_base float64 length float64 width float64 height float64 curb_weight int64 engine_type object num_cylinders object engine_size int64 fuel_system object bore float64 stroke float64 compression_ratio float64 horsepower float64 peak_rpm float64 city_mpg int64 highway_mpg int64 price float64 dtype: object # 如果只關注category 類型的數據,其實根本沒有必要拿到這些全部數據,只需要將object類型的數據取出,然后進行后續分析即可 obj_df = df.select_dtypes(include=['object']).copy() obj_df.head() makefuel_typeaspirationnum_doorsbody_styledrive_wheelsengine_locationengine_typenum_cylindersfuel_system01234
alfa-romerogasstdtwoconvertiblerwdfrontdohcfourmpfi
alfa-romerogasstdtwoconvertiblerwdfrontdohcfourmpfi
alfa-romerogasstdtwohatchbackrwdfrontohcvsixmpfi
audigasstdfoursedanfwdfrontohcfourmpfi
audigasstdfoursedan4wdfrontohcfivempfi
# 在進行下一步處理的之前,需要將數據進行缺失值的處理,對列進行處理axis=1 obj_df[obj_df.isnull().any(axis=1)] makefuel_typeaspirationnum_doorsbody_styledrive_wheelsengine_locationengine_typenum_cylindersfuel_system2763
dodgegasturboNaNsedanfwdfrontohcfourmpfi
mazdadieselstdNaNsedanfwdfrontohcfouridi
# 處理缺失值的方式有很多種,根據項目的不同或者填補缺失值或者去掉該樣本。本文中的數據缺失用該列的眾數來補充。 obj_df.num_doors.value_counts() four 114 two 89 Name: num_doors, dtype: int64 obj_df=obj_df.fillna({"num_doors":"four"})

在處理完缺失值之后,有以下幾種方式進行category數據轉化encoding

  • Find and Replace
  • label encoding
  • One Hot encoding
  • Custom Binary encoding
  • sklearn
  • advanced Approaches
# pandas里面的replace文檔非常豐富,筆者在使用該功能時候,深感其參數眾多,深感提供的功能也非常的強大 # 本文中使用replace的功能,創建map的字典,針對需要數據清理的列進行清理更加方便,例如: cleanup_nums= {"num_doors":{"four":4,"two":2},"num_cylinders":{"four":4,"six":6,"five":5,"eight":8,"two":2,"twelve":12,"three":3} } obj_df.replace(cleanup_nums,inplace=True) obj_df.head() makefuel_typeaspirationnum_doorsbody_styledrive_wheelsengine_locationengine_typenum_cylindersfuel_system01234
alfa-romerogasstd2convertiblerwdfrontdohc4mpfi
alfa-romerogasstd2convertiblerwdfrontdohc4mpfi
alfa-romerogasstd2hatchbackrwdfrontohcv6mpfi
audigasstd4sedanfwdfrontohc4mpfi
audigasstd4sedan4wdfrontohc5mpfi

label encoding 是將一組無規則的,沒有大小比較的數據轉化為數字

  • 比如body_style 字段中含有多個數據值,可以使用該方法將其轉化
  • convertible > 0
  • hardtop > 1
  • hatchback > 2
  • sedan > 3
  • wagon > 4

這種方式就像是密碼編碼一樣,這,個比喻很有意思,就像之前看電影,記得一句臺詞,他們倆親密的像做賊一樣

# 通過pandas里面的 category數據類型,可以很方便的或者該編碼 obj_df["body_style"]=obj_df["body_style"].astype("category") obj_df.dtypes make object fuel_type object aspiration object num_doors int64 body_style category drive_wheels object engine_location object engine_type object num_cylinders int64 fuel_system object dtype: object # 我們可以通過賦值新的列,保存其對應的code # 通過這種方法可以舒服的數據,便于以后的數據分析以及整理 obj_df["body_style_code"] = obj_df["body_style"].cat.codes obj_df.head() makefuel_typeaspirationnum_doorsbody_styledrive_wheelsengine_locationengine_typenum_cylindersfuel_systembody_style_code01234
alfa-romerogasstd2convertiblerwdfrontdohc4mpfi0
alfa-romerogasstd2convertiblerwdfrontdohc4mpfi0
alfa-romerogasstd2hatchbackrwdfrontohcv6mpfi2
audigasstd4sedanfwdfrontohc4mpfi3
audigasstd4sedan4wdfrontohc5mpfi3

one hot encoding

  • label encoding 因為將wagon轉化為4,而convertible變成了0,這里面是不是會有大大小的比較,可能會造成誤解,然后利用one hot encoding這種方式
    是將特征轉化為0或者1,這樣會增加數據的列的數量,同時也減少了label encoding造成的衡量數據大小的誤解。
  • pandas中提供了get_dummies 方法可以將需要轉化的列的值轉化為0,1,兩種編碼
# 新生成DataFrame包含了新生成的三列數據, # drive_wheels_4wd # drive_wheels_fwd # drive_wheels_rwd pd.get_dummies(obj_df,columns=["drive_wheels"]).head() makefuel_typeaspirationnum_doorsbody_styleengine_locationengine_typenum_cylindersfuel_systembody_style_codedrive_wheels_4wddrive_wheels_fwddrive_wheels_rwd01234
alfa-romerogasstd2convertiblefrontdohc4mpfi0001
alfa-romerogasstd2convertiblefrontdohc4mpfi0001
alfa-romerogasstd2hatchbackfrontohcv6mpfi2001
audigasstd4sedanfrontohc4mpfi3010
audigasstd4sedanfrontohc5mpfi3100
# 該方法之所以強大,是因為可以同時處理多個category的列,同時選擇prefix前綴分別對應好 # 產生的新的DataFrame所有數據都包含 pd.get_dummies(obj_df, columns=["body_style", "drive_wheels"], prefix=["body", "drive"]).head() makefuel_typeaspirationnum_doorsengine_locationengine_typenum_cylindersfuel_systembody_style_codebody_convertiblebody_hardtopbody_hatchbackbody_sedanbody_wagondrive_4wddrive_fwddrive_rwd01234
alfa-romerogasstd2frontdohc4mpfi010000001
alfa-romerogasstd2frontdohc4mpfi010000001
alfa-romerogasstd2frontohcv6mpfi200100001
audigasstd4frontohc4mpfi300010010
audigasstd4frontohc5mpfi300010100

自定義0,1 encoding

  • 有的時候回根據業務需要,可能會結合label encoding以及not hot 兩種方式進行二值化。
obj_df["engine_type"].value_counts() ohc 148 ohcf 15 ohcv 13 dohc 12 l 12 rotor 4 dohcv 1 Name: engine_type, dtype: int64 # 有的時候為了區分出 engine_type是否是och技術的,可以使用二值化,將該列進行處理 # 這也突出了領域知識是如何以最有效的方式解決問題 obj_df["engine_type_code"] = np.where(obj_df["engine_type"].str.contains("ohc"),1,0) obj_df[["make","engine_type","engine_type_code"]].head() makeengine_typeengine_type_code01234
alfa-romerodohc1
alfa-romerodohc1
alfa-romeroohcv1
audiohc1
audiohc1

scikit-learn中的數據轉化

  • sklearn.processing模塊提供了很多方便的數據轉化以及缺失值處理方式(Imputer),可以直接從該模塊導入LabelEncoder,LabelBinarizer,0,1歸一化(最大最小標準化),Normalizer正則化(L1,L2)一般用的不多,標準化(最大最小標準化max_mix),非線性轉換,生成多項式特征(PolynomialFeatures),將每個特征縮放在同樣的范圍或分布情況下
  • sklearn processing 模塊官網文檔鏈接
  • category_encoders包官方文檔

至此,數據預處理以及category轉化大致講完了。

posted on 2018-08-02 15:53 多一點 閱讀(...) 評論(...) 編輯 收藏

總結

以上是生活随笔為你收集整理的pandas category数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。