国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Pandas數(shù)據(jù)類型轉(zhuǎn)換的幾個(gè)小技巧

luckyw / 515人閱讀

摘要:利用的一些輔助函數(shù)進(jìn)行類型轉(zhuǎn)換的函數(shù)和復(fù)雜的自定函數(shù)之間有一個(gè)中間段,那就是的一些輔助函數(shù)。這些輔助函數(shù)對(duì)于某些特定數(shù)據(jù)類型的轉(zhuǎn)換非常有用如。

利用Pandas進(jìn)行數(shù)據(jù)分析時(shí),確保使用正確的數(shù)據(jù)類型是非常重要的,否則可能會(huì)導(dǎo)致一些不可預(yù)知的錯(cuò)誤發(fā)生。筆者使用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庫(kù)是在Numpy的基礎(chǔ)之上開發(fā)的的。
引入實(shí)際數(shù)據(jù)進(jìn)行分析

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

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é)果來(lái)看并沒有像想象中那樣數(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)

增長(zhǎng)率、所屬組的數(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)換最簡(jiǎ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é)果看起來(lái)很不錯(cuò),接下來(lái)給出幾個(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é)果看起來(lái)不錯(cuò),但仔細(xì)觀察后,會(huì)發(fā)現(xiàn)一個(gè)大問題。那就是所有的值都被替換為True了,但是該列中包含好幾個(gè)N標(biāo)志,所以astype()函數(shù)在該列也是失效的。

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

數(shù)據(jù)列中的每一個(gè)單位都能簡(jiǎn)單的解釋為數(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ù)雜的情形,可以通過(guò)構(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ù)通過(guò)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ì)比較簡(jiǎn)潔但是對(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)用于增長(zhǎng)率,首先構(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ù)通過(guò)covert_percent函數(shù)應(yīng)用于增長(zhǎng)率列中的所有數(shù)據(jù)中。

data["增長(zhǎng)率"].apply(convert_percent)

使用lambda表達(dá)式:

data["增長(zhǎng)率"].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ù)可以把多帶帶的year、month、day三列合并成一個(gè)多帶帶的時(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,
                               "增長(zhǎng)率": 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ǎn)潔的,筆者自己也很喜歡使用)
總結(jié)
對(duì)數(shù)據(jù)集進(jìn)行操作的第一步是確保設(shè)置正確的數(shù)據(jù)類型,然后才能進(jìn)行數(shù)據(jù)的分析、可視化等操作,Pandas提供了很多非常方便的函數(shù),有了這些函數(shù)那么對(duì)數(shù)據(jù)進(jìn)行分析將會(huì)是很方便的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/41673.html

相關(guān)文章

  • Pandas之旅(七) 誰(shuí)說(shuō)pandas

    摘要:下面讓我們開始提速假設(shè)我們現(xiàn)在的電價(jià)是定值,不根據(jù)用電時(shí)間段來(lái)改變,那么中最快的方法那就是采用,這就是一個(gè)簡(jiǎn)單的矢量化操作示范。它基本是在中運(yùn)行最快的方式。 Pandas 加速 大家好,今天我們來(lái)看有關(guān)pandas加速的小技巧,不知道大家在剛剛接觸pandas的時(shí)候有沒有聽過(guò)如下的說(shuō)法 pandas太慢了,運(yùn)行要等半天 其實(shí)我想說(shuō)的是,慢不是pandas的錯(cuò),大家要知道pandas本身...

    genedna 評(píng)論0 收藏0
  • JavaScript 的幾個(gè)小技巧

    摘要:的幾個(gè)小技巧盡早將無(wú)效的用例盡早返回,避免意外和不必要的代碼處理。要添加一種新的就需要再添加一個(gè)分支判斷多重判斷時(shí)使用或者,避免過(guò)長(zhǎng)邏輯判斷改進(jìn)后一次循環(huán)兩個(gè)數(shù)組 JavaScript 的幾個(gè)小技巧 1. 盡早 return function transformData(rawData) { // check if no data if (!rawData) { ret...

    arashicage 評(píng)論0 收藏0
  • 關(guān)于PHP數(shù)組的幾個(gè)小技巧

    摘要:我們知道在中多了幾個(gè)對(duì)數(shù)組使用的新特性。這里我們舉兩個(gè)實(shí)際的例子吧例子一仔細(xì)體會(huì)。例子二看到了吧,可以直接在循環(huán)中指定變量,然后在循環(huán)體中來(lái)使用,是不是很簡(jiǎn)單好了本文就這些內(nèi)容了,歡迎繼續(xù)關(guān)注。更多知識(shí),請(qǐng)前往 我們知道在PHP7.1中多了幾個(gè)對(duì)數(shù)組使用的新特性。 這里我們舉兩個(gè)實(shí)際的例子吧: 例子一: // PHP 7.1+ $options = [enabled => true, ...

    chenjiang3 評(píng)論0 收藏0
  • 10個(gè)Python Pandas技巧,使您的工作更有效率

    摘要:是一個(gè)廣泛用于結(jié)構(gòu)化數(shù)據(jù)的包。因此,的任何變化都會(huì)導(dǎo)致發(fā)生變化。這是檢查值分布的命令。這也是每個(gè)人都會(huì)使用的命令。我想在這里指出兩個(gè)技巧。另一個(gè)技巧是處理混合在一起的整數(shù)和缺失值。將所有浮點(diǎn)數(shù)舍入為整數(shù)。 showImg(https://segmentfault.com/img/remote/1460000019138448?w=432&h=270); Pandas是一個(gè)廣泛用于結(jié)構(gòu)化...

    stormjun 評(píng)論0 收藏0
  • JavaScript幾個(gè)小技巧

    摘要:反之左操作數(shù)值為真,整個(gè)表達(dá)式的值則依賴于右操作數(shù)。以上的這種特性稱為運(yùn)算符的短路行為,根據(jù)這個(gè)特性我們可以有效減少語(yǔ)句的使用,還可以增強(qiáng)程序的健壯性。數(shù)值上一個(gè)空串,會(huì)轉(zhuǎn)換為字符串字符串減會(huì)轉(zhuǎn)換為數(shù)值,如失敗則返回。 &&、||運(yùn)算的高級(jí)用法 ??在JavaSript中,&&運(yùn)算符除了可以對(duì)布爾值進(jìn)行與(AND)運(yùn)算之外,還可以對(duì)真假值進(jìn)行與(AND)運(yùn)算。JavaScript中所有...

    Apollo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<