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

資訊專欄INFORMATION COLUMN

Pandas數據類型轉換的幾個小技巧

luckyw / 523人閱讀

摘要:利用的一些輔助函數進行類型轉換的函數和復雜的自定函數之間有一個中間段,那就是的一些輔助函數。這些輔助函數對于某些特定數據類型的轉換非常有用如。

利用Pandas進行數據分析時,確保使用正確的數據類型是非常重要的,否則可能會導致一些不可預知的錯誤發生。筆者使用Pandas已經有一段時間了,但是還是會在一些小問題上犯錯誤,追根溯源發現在對數據進行操作時某些特征列并不是Pandas所能處理的類型。因此本文將討論一些小技巧如何將Python的基本數據類型轉化為Pandas所能處理的數據類型。

Pandas、Numpy、Python各自支持的數據類型


從上述表格中可以看出Pandas支持的數據類型最為豐富,在某種情形下Numpy的數據類型可以和Pandas的數據類型相互轉化,畢竟Pandas庫是在Numpy的基礎之上開發的的。
引入實際數據進行分析

數據類型是你平常可能不太關心,直到得到了錯誤的結果才映像深刻的東西,因此在這里引入一個實際數據分析的例子來加深理解。

import numpy as np
import pandas as pd

data = pd.read_csv("data.csv", encoding="gbk") #因為數據中含有中文數據
data


數據加載完畢,如果現在想要在該數據上進行一些操作,比如把數據列2016、2017對應項相加。

data["2016"] + data["2017"] #想當然的做法


從結果來看并沒有像想象中那樣數值對應相加,這是因為在Pandas中object類型相加等價于Python中的字符串相加。

data.info() #在對數據進行處理之前應該先查看加載數據的相關信息


在看到加載數據的相關信息后可以發現如下幾個問題:

客戶編號的數據類型是int64而不是object類型

2016、2017列的數據類型是object而不是數值類型(int64、float64)

增長率、所屬組的數據類型應該為數值類型而不是object類型

year、month、day的數據類型應該為datetime64類型而不是object類型

Pandas中進行數據類型轉換有三種基本方法:

使用astype()函數進行強制類型轉換

自定義函數進行數據類型轉換

使用Pandas提供的函數如to_numeric()、to_datetime()

使用astype()函數進行類型轉換
對數據列進行數據類型轉換最簡單的方法就是使用astype()函數

data["客戶編號"].astype("object")

data["客戶編號"] = data["客戶編號"].astype("object") #對原始數據進行轉換并覆蓋原始數據列


上面的結果看起來很不錯,接下來給出幾個astype()函數作用于列數據但失效的例子

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

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


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

data["狀態"].astype("bool")


乍一看,結果看起來不錯,但仔細觀察后,會發現一個大問題。那就是所有的值都被替換為True了,但是該列中包含好幾個N標志,所以astype()函數在該列也是失效的。

總結一下astype()函數有效的情形:

數據列中的每一個單位都能簡單的解釋為數字(2, 2.12等)

數據列中的每一個單位都是數值類型且向字符串object類型轉換

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

使用自定義函數進行數據類型轉換
該方法特別適用于待轉換數據列的數據較為復雜的情形,可以通過構建一個函數應用于數據列的每一個數據,并將其轉換為適合的數據類型。
對于上述數據中的貨幣,需要將它轉換為float類型,因此可以寫一個轉換函數:

def convert_currency(value):
    """
    轉換字符串數字為float類型
     - 移除 ¥ ,
     - 轉化為float類型
    """
    new_value = value.replace(",", "").replace("¥", "")
    return np.float(new_value)

現在可以使用Pandas的apply函數通過covert_currency函數應用于2016列中的所有數據中。

data["2016"].apply(convert_currency)


該列所有的數據都轉換成對應的數值類型了,因此可以對該列數據進行常見的數學操作了。如果利用lambda表達式改寫一下代碼,可能會比較簡潔但是對新手不太友好。

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

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

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

同樣的方法運用于增長率,首先構建自定義函數

def convert_percent(value):
    """
    轉換字符串百分數為float類型小數
    - 移除 %
    - 除以100轉換為小數
    """
    new_value = value.replace("%", "")
    return float(new_value) / 100

使用Pandas的apply函數通過covert_percent函數應用于增長率列中的所有數據中。

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

使用lambda表達式:

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

結果都相同:

為了轉換狀態列,可以使用Numpy中的where函數,把值為Y的映射成True,其他值全部映射成False。

data["狀態"] = np.where(data["狀態"] == "Y", True, False)

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

利用Pandas的一些輔助函數進行類型轉換
Pandas的astype()函數和復雜的自定函數之間有一個中間段,那就是Pandas的一些輔助函數。這些輔助函數對于某些特定數據類型的轉換非常有用(如to_numeric()、to_datetime())。所屬組數據列中包含一個非數值,用astype()轉換出現了錯誤,然而用to_numeric()函數處理就優雅很多。

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


可以看到,非數值被替換成0.0了,當然這個填充值是可以選擇的,具體文檔見
pandas.to_numeric - pandas 0.22.0 documentation

Pandas中的to_datetime()函數可以把多帶帶的year、month、day三列合并成一個多帶帶的時間戳。

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

完成數據列的替換

data["new_date"] = pd.to_datetime(data[["day", "month", "year"]]) #新產生的一列數據
data["所屬組"] = pd.to_numeric(data["所屬組"], errors="coerce").fillna(0)

到這里所有的數據列都轉換完畢,最終的數據顯示:


在讀取數據時就對數據類型進行轉換,一步到位

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

在這里也體現了使用自定義函數比lambda表達式要方便很多。(大部分情況下lambda還是很簡潔的,筆者自己也很喜歡使用)
總結
對數據集進行操作的第一步是確保設置正確的數據類型,然后才能進行數據的分析、可視化等操作,Pandas提供了很多非常方便的函數,有了這些函數那么對數據進行分析將會是很方便的。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/41673.html

相關文章

  • Pandas之旅(七) 誰說pandas

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

    genedna 評論0 收藏0
  • JavaScript 的幾個小技巧

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

    arashicage 評論0 收藏0
  • 關于PHP數組的幾個小技巧

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

    chenjiang3 評論0 收藏0
  • 10個Python Pandas技巧,使您的工作更有效率

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

    stormjun 評論0 收藏0
  • JavaScript幾個小技巧

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

    Apollo 評論0 收藏0

發表評論

0條評論

luckyw

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<