最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Pandas實(shí)現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換的一些小技巧匯總

 更新時(shí)間:2018年05月07日 11:32:05   作者:楊航鋒  
這篇文章主要給大家匯總介紹了關(guān)于Pandas實(shí)現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換的一些小技巧,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

Pandas是Python當(dāng)中重要的數(shù)據(jù)分析工具,利用Pandas進(jìn)行數(shù)據(jù)分析時(shí),確保使用正確的數(shù)據(jù)類型是非常重要的,否則可能會(huì)導(dǎo)致一些不可預(yù)知的錯(cuò)誤發(fā)生。

Pandas 的數(shù)據(jù)類型:數(shù)據(jù)類型本質(zhì)上是編程語言用來理解如何存儲(chǔ)和操作數(shù)據(jù)的內(nèi)部結(jié)構(gòu)。例如,一個(gè)程序需要理解你可以將兩個(gè)數(shù)字加起來,比如 5 + 10 得到 15。或者,如果是兩個(gè)字符串,比如「cat」和「hat」,你可以將它們連接(加)起來得到「cathat」。尚學(xué)堂•百戰(zhàn)程序員陳老師指出有關(guān) Pandas 數(shù)據(jù)類型的一個(gè)可能令人困惑的地方是,Pandas、Python 和 numpy 的數(shù)據(jù)類型之間有一些重疊。

大多數(shù)情況下,你不必?fù)?dān)心是否應(yīng)該明確地將熊貓類型強(qiáng)制轉(zhuǎn)換為對(duì)應(yīng)的 NumPy 類型。一般來說使用 Pandas 的默認(rèn) int64 和 float64 就可以。我列出此表的唯一原因是,有時(shí)你可能會(huì)在代碼行間或自己的分析過程中看到 Numpy 的類型。
數(shù)據(jù)類型是在你遇到錯(cuò)誤或意外結(jié)果之前并不會(huì)關(guān)心的事情之一。不過當(dāng)你將新數(shù)據(jù)加載到 Pandas 進(jìn)行進(jìn)一步分析時(shí),這也是你應(yīng)該檢查的第一件事情。

筆者使用Pandas已經(jīng)有一段時(shí)間了,但是還是會(huì)在一些小問題上犯錯(cuò)誤,追根溯源發(fā)現(xiàn)在對(duì)數(shù)據(jù)進(jìn)行操作時(shí)某些特征列并不是Pandas所能處理的類型。因此本文將討論一些小技巧如何將Python的基本數(shù)據(jù)類型轉(zhuǎn)化為Pandas所能處理的數(shù)據(jù)類型。

Pandas、Numpy、Python各自支持的數(shù)據(jù)類型


從上述表格中可以看出Pandas支持的數(shù)據(jù)類型最為豐富,在某種情形下Numpy的數(shù)據(jù)類型可以和Pandas的數(shù)據(jù)類型相互轉(zhuǎn)化,畢竟Pandas庫是在Numpy的基礎(chǔ)之上開發(fā)的的。

引入實(shí)際數(shù)據(jù)進(jìn)行分析

數(shù)據(jù)類型是你平??赡懿惶P(guān)心,直到得到了錯(cuò)誤的結(jié)果才映像深刻的東西,因此在這里引入一個(gè)實(shí)際數(shù)據(jù)分析的例子來加深理解。

import numpy as np
import pandas as pd

data = pd.read_csv('data.csv', encoding='gbk') #因?yàn)閿?shù)據(jù)中含有中文數(shù)據(jù)
data


數(shù)據(jù)加載完畢,如果現(xiàn)在想要在該數(shù)據(jù)上進(jìn)行一些操作,比如把數(shù)據(jù)列2016、2017對(duì)應(yīng)項(xiàng)相加。

data['2016'] + data['2017'] #想當(dāng)然的做法


從結(jié)果來看并沒有像想象中那樣數(shù)值對(duì)應(yīng)相加,這是因?yàn)樵赑andas中object類型相加等價(jià)于Python中的字符串相加。

data.info() #在對(duì)數(shù)據(jù)進(jìn)行處理之前應(yīng)該先查看加載數(shù)據(jù)的相關(guān)信息


在看到加載數(shù)據(jù)的相關(guān)信息后可以發(fā)現(xiàn)如下幾個(gè)問題:

  • 客戶編號(hào)的數(shù)據(jù)類型是int64而不是object類型
  • 2016、2017列的數(shù)據(jù)類型是object而不是數(shù)值類型(int64、float64)
  • 增長率、所屬組的數(shù)據(jù)類型應(yīng)該為數(shù)值類型而不是object類型
  • year、month、day的數(shù)據(jù)類型應(yīng)該為datetime64類型而不是object類型

Pandas中進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換有三種基本方法:

  • 使用astype()函數(shù)進(jìn)行強(qiáng)制類型轉(zhuǎn)換
  • 自定義函數(shù)進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換
  • 使用Pandas提供的函數(shù)如to_numeric()、to_datetime()

使用astype()函數(shù)進(jìn)行類型轉(zhuǎn)換

對(duì)數(shù)據(jù)列進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換最簡單的方法就是使用astype()函數(shù)

data['客戶編號(hào)'].astype('object')

data['客戶編號(hào)'] = data['客戶編號(hào)'].astype('object') #對(duì)原始數(shù)據(jù)進(jìn)行轉(zhuǎn)換并覆蓋原始數(shù)據(jù)列

上面的結(jié)果看起來很不錯(cuò),接下來給出幾個(gè)astype()函數(shù)作用于列數(shù)據(jù)但失效的例子

data['2017'].astype('float')

data['所屬組'].astype('int')


從上面兩個(gè)例子可以看出,當(dāng)待轉(zhuǎn)換列中含有不能轉(zhuǎn)換的特殊值時(shí)(例子中¥,ErrorValue等)astype()函數(shù)將失效。有些時(shí)候astype()函數(shù)執(zhí)行成功了也并不一定代表著執(zhí)行結(jié)果符合預(yù)期(神坑!)

data['狀態(tài)'].astype('bool')


乍一看,結(jié)果看起來不錯(cuò),但仔細(xì)觀察后,會(huì)發(fā)現(xiàn)一個(gè)大問題。那就是所有的值都被替換為True了,但是該列中包含好幾個(gè)N標(biāo)志,所以astype()函數(shù)在該列也是失效的。

總結(jié)一下astype()函數(shù)有效的情形:

  • 數(shù)據(jù)列中的每一個(gè)單位都能簡單的解釋為數(shù)字(2, 2.12等)
  • 數(shù)據(jù)列中的每一個(gè)單位都是數(shù)值類型且向字符串object類型轉(zhuǎn)換

如果數(shù)據(jù)中含有缺失值、特殊字符astype()函數(shù)可能失效。

使用自定義函數(shù)進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換

該方法特別適用于待轉(zhuǎn)換數(shù)據(jù)列的數(shù)據(jù)較為復(fù)雜的情形,可以通過構(gòu)建一個(gè)函數(shù)應(yīng)用于數(shù)據(jù)列的每一個(gè)數(shù)據(jù),并將其轉(zhuǎn)換為適合的數(shù)據(jù)類型。

對(duì)于上述數(shù)據(jù)中的貨幣,需要將它轉(zhuǎn)換為float類型,因此可以寫一個(gè)轉(zhuǎn)換函數(shù):

def convert_currency(value):
 """
 轉(zhuǎn)換字符串?dāng)?shù)字為float類型
 - 移除 ¥ ,
 - 轉(zhuǎn)化為float類型
 """
 new_value = value.replace(',', '').replace('¥', '')
 return np.float(new_value)

現(xiàn)在可以使用Pandas的apply函數(shù)通過covert_currency函數(shù)應(yīng)用于2016列中的所有數(shù)據(jù)中。

data['2016'].apply(convert_currency)


該列所有的數(shù)據(jù)都轉(zhuǎn)換成對(duì)應(yīng)的數(shù)值類型了,因此可以對(duì)該列數(shù)據(jù)進(jìn)行常見的數(shù)學(xué)操作了。如果利用lambda表達(dá)式改寫一下代碼,可能會(huì)比較簡潔但是對(duì)新手不太友好。

data['2016'].apply(lambda x: x.replace('¥', '').replace(',', '')).astype('float')

當(dāng)函數(shù)需要重復(fù)應(yīng)用于多個(gè)列時(shí),個(gè)人推薦使用第一種方法,先定義函數(shù)還有一個(gè)好處就是可以搭配read_csv()函數(shù)使用(后面介紹)。

#2016、2017列完整的轉(zhuǎn)換代碼
data['2016'] = data['2016'].apply(convert_currency)
data['2017'] = data['2017'].apply(convert_currency)

同樣的方法運(yùn)用于增長率,首先構(gòu)建自定義函數(shù)

def convert_percent(value):
 """
 轉(zhuǎn)換字符串百分?jǐn)?shù)為float類型小數(shù)
 - 移除 %
 - 除以100轉(zhuǎn)換為小數(shù)
 """
 new_value = value.replace('%', '')
 return float(new_value) / 100

使用Pandas的apply函數(shù)通過covert_percent函數(shù)應(yīng)用于增長率列中的所有數(shù)據(jù)中。

data['增長率'].apply(convert_percent)

使用lambda表達(dá)式:

data['增長率'].apply(lambda x: x.replace('%', '')).astype('float') / 100

結(jié)果都相同:


為了轉(zhuǎn)換狀態(tài)列,可以使用Numpy中的where函數(shù),把值為Y的映射成True,其他值全部映射成False。

data['狀態(tài)'] = np.where(data['狀態(tài)'] == 'Y', True, False)

同樣的你也可以使用自定義函數(shù)或者使用lambda表達(dá)式,這些方法都可以完美的解決這個(gè)問題,這里只是多提供一種思路。

利用Pandas的一些輔助函數(shù)進(jìn)行類型轉(zhuǎn)換

Pandas的astype()函數(shù)和復(fù)雜的自定函數(shù)之間有一個(gè)中間段,那就是Pandas的一些輔助函數(shù)。這些輔助函數(shù)對(duì)于某些特定數(shù)據(jù)類型的轉(zhuǎn)換非常有用(如to_numeric()、to_datetime())。所屬組數(shù)據(jù)列中包含一個(gè)非數(shù)值,用astype()轉(zhuǎn)換出現(xiàn)了錯(cuò)誤,然而用to_numeric()函數(shù)處理就優(yōu)雅很多。

pd.to_numeric(data['所屬組'], errors='coerce').fillna(0)


可以看到,非數(shù)值被替換成0.0了,當(dāng)然這個(gè)填充值是可以選擇的,具體文檔見
pandas.to_numeric - pandas 0.22.0 documentation

Pandas中的to_datetime()函數(shù)可以把單獨(dú)的year、month、day三列合并成一個(gè)單獨(dú)的時(shí)間戳。

pd.to_datetime(data[['day', 'month', 'year']])

完成數(shù)據(jù)列的替換

data['new_date'] = pd.to_datetime(data[['day', 'month', 'year']]) #新產(chǎn)生的一列數(shù)據(jù)
data['所屬組'] = pd.to_numeric(data['所屬組'], errors='coerce').fillna(0)

到這里所有的數(shù)據(jù)列都轉(zhuǎn)換完畢,最終的數(shù)據(jù)顯示:


在讀取數(shù)據(jù)時(shí)就對(duì)數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,一步到位

data2 = pd.read_csv("data.csv",
   converters={
    '客戶編號(hào)': str,
    '2016': convert_currency,
    '2017': convert_currency,
    '增長率': convert_percent,
    '所屬組': lambda x: pd.to_numeric(x, errors='coerce'),
    '狀態(tài)': lambda x: np.where(x == "Y", True, False)
    },
   encoding='gbk')

在這里也體現(xiàn)了使用自定義函數(shù)比lambda表達(dá)式要方便很多。(大部分情況下lambda還是很簡潔的,筆者自己也很喜歡使用)

總結(jié)

對(duì)數(shù)據(jù)集進(jìn)行操作的第一步是確保設(shè)置正確的數(shù)據(jù)類型,然后才能進(jìn)行數(shù)據(jù)的分析、可視化等操作,Pandas提供了很多非常方便的函數(shù),有了這些函數(shù)那么對(duì)數(shù)據(jù)進(jìn)行分析將會(huì)是很方便的。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Python的Flask框架中web表單的教程

    Python的Flask框架中web表單的教程

    這篇文章主要介紹了Python的Flask框架中web表單的教程,表單是學(xué)習(xí)各個(gè)web框架中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-04-04
  • python和go語言的區(qū)別是什么

    python和go語言的區(qū)別是什么

    在本篇文章中小編給大家整理的是一篇關(guān)于go語言和python的區(qū)別點(diǎn),需要的朋友們可以學(xué)習(xí)下。
    2020-07-07
  • Python利用PyExecJS庫執(zhí)行JS函數(shù)的案例分析

    Python利用PyExecJS庫執(zhí)行JS函數(shù)的案例分析

    這篇文章主要介紹了Python利用PyExecJS庫執(zhí)行JS函數(shù),本文通過案例分析給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 詳解Python異常處理中的Finally else的功能

    詳解Python異常處理中的Finally else的功能

    本篇文章主要介紹了詳解Python異常處理中的Finally else的功能,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • Sanic框架安裝與簡單入門示例

    Sanic框架安裝與簡單入門示例

    這篇文章主要介紹了Sanic框架安裝與簡單用法,結(jié)合實(shí)例形式簡單分析了Sanic框架的概念、原理、pip命令安裝以及使用方法,需要的朋友可以參考下
    2018-07-07
  • Python中遍歷列表的方法總結(jié)

    Python中遍歷列表的方法總結(jié)

    在本篇文章里小編給大家分享了關(guān)于Python中遍歷列表的方法以及知識(shí)點(diǎn)總結(jié),有需要的朋友們學(xué)習(xí)下。
    2019-06-06
  • PyQt5簡單讀取以及顯示圖片的應(yīng)用實(shí)例

    PyQt5簡單讀取以及顯示圖片的應(yīng)用實(shí)例

    我們?cè)谶M(jìn)行圖像處理時(shí),經(jīng)常會(huì)用到讀取圖片并顯示出來這樣的操作,下面這篇文章主要給大家介紹了關(guān)于PyQt5簡單讀取以及顯示圖片應(yīng)用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • python監(jiān)控鍵盤輸入實(shí)例代碼

    python監(jiān)控鍵盤輸入實(shí)例代碼

    這篇文章主要介紹了python監(jiān)控鍵盤輸入實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Python自動(dòng)化運(yùn)維和部署項(xiàng)目工具Fabric使用實(shí)例

    Python自動(dòng)化運(yùn)維和部署項(xiàng)目工具Fabric使用實(shí)例

    Fabric是一個(gè)Python庫,只要目標(biāo)機(jī)器支持ssh訪問,就可以借助fabric來進(jìn)行遠(yuǎn)程操作(如在host1上對(duì)host2遠(yuǎn)程運(yùn)行shell命令),顯然,由于fabric是個(gè)Python package,故其它Python package都可以被import到fabric特有的fabfile.py腳本中
    2016-09-09
  • Python超詳細(xì)講解元類的使用

    Python超詳細(xì)講解元類的使用

    在Python里一切都是對(duì)象(object),基本數(shù)據(jù)類型,如數(shù)字,字符串,函數(shù)都是對(duì)象。對(duì)象可以由類(class)進(jìn)行創(chuàng)建。那么既然一切都是對(duì)象,那么類是對(duì)象嗎?是的,類也是對(duì)象,那么又是誰創(chuàng)造了類呢?答案也很簡單,也是類,一個(gè)能創(chuàng)作類的類,稱之為(type)元類
    2022-06-06

最新評(píng)論

光泽县| 宁蒗| 开封市| 明星| 玉田县| 建宁县| 白银市| 博白县| 图们市| 金昌市| 樟树市| 托克逊县| 甘南县| 平南县| 津南区| 扶余县| 汉沽区| 英吉沙县| 河东区| 常州市| 绥化市| 丰原市| 师宗县| 淮南市| 三原县| 祥云县| 二连浩特市| 北票市| 华阴市| 阳城县| 郁南县| 塔河县| 齐河县| 象州县| 苏尼特左旗| 新龙县| 彰化县| 浪卡子县| 化德县| 房产| 蚌埠市|