<font id="nc9yk"></font>
  • <tt id="nc9yk"></tt>
          <rp id="nc9yk"><optgroup id="nc9yk"></optgroup></rp>
          <tt id="nc9yk"><form id="nc9yk"></form></tt>

            <cite id="nc9yk"></cite>

            pandas 數據類型轉換的實現

             更新時間:2020年12月29日 16:44:15   作者:多一點  
            這篇文章主要介紹了pandas 數據類型轉換的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

            數據處理過程的數據類型

            當利用pandas進行數據處理的時候,經常會遇到數據類型的問題,當拿到數據的時候,首先需要確定拿到的是正確類型的數據,一般通過數據類型的轉化,這篇文章就介紹pandas里面的數據類型(data types也就是常用的dtyps),以及pandas與numpy之間的數據對應關系。

            主要介紹object,int64,float64,datetime64,bool等幾種類型,category與timedelta兩種類型會單獨的在其他文章中進行介紹。當然本文中也會涉及簡單的介紹。
            數據類型的問題一般都是出了問題之后才會發現的,所以有了一些經驗之后就會拿到數據之后,就直接看數據類型,是否與自己想要處理的數據格式一致,這樣可以從一開始避免一些尷尬的問題出現。那么我們以一個簡單的例子,利用jupyter notebook進行一個數據類型的介紹。

            ####按照慣例導入兩個常用的數據處理的包,numpy與pandas
            import numpy as np
            import pandas as pd
            # 從csv文件讀取數據,數據表格中只有5行,里面包含了float,string,int三種數據python類型,也就是分別對應的pandas的float64,object,int64
            # csv文件中共有六列,第一列是表頭,其余是數據。
            df = pd.read_csv("sales_data_types.csv")
            print(df)
            

               Customer Number     Customer Name          2016            2017  \
            0            10002  Quest Industries  $125,000.00     $162,500.00   
            1           552278    Smith Plumbing  $920,000.00   $1,012,000.00   
            2            23477   ACME Industrial   $50,000.00      $62,500.00   
            3            24900        Brekke LTD  $350,000.00     $490,000.00   
            4           651029         Harbor Co   $15,000.00      $12,750.00   

              Percent Growth Jan Units  Month  Day  Year Active 
            0         30.00%       500      1   10  2015      Y 
            1         10.00%       700      6   15  2014      Y 
            2         25.00%       125      3   29  2016      Y 
            3          4.00%        75     10   27  2015      Y 
            4        -15.00%    Closed      2    2  2014      N 

            df.dtypes
            

            Customer Number     int64
            Customer Name      object
            2016               object
            2017               object
            Percent Growth     object
            Jan Units          object
            Month               int64
            Day                 int64
            Year                int64
            Active             object
            dtype: object

            # 假如想得到2016年與2017年的數據總和,可以嘗試,但并不是我們需要的答案,因為這兩列中的數據類型是object,執行該操作之后,得到是一個更加長的字符串,
            # 當然我們可以通過df.info() 來獲得關于數據框的更多的詳細信息,
            df['2016']+df['2017']
            
            

            0      $125,000.00 $162,500.00
            1    $920,000.00 $1,012,000.00
            2        $50,000.00 $62,500.00
            3      $350,000.00 $490,000.00
            4        $15,000.00 $12,750.00
            dtype: object

            df.info()
            # Customer Number 列是float64,然而應該是int64
            # 2016 2017兩列的數據是object,并不是float64或者int64格式
            # Percent以及Jan Units 也是objects而不是數字格式
            # Month,Day以及Year應該轉化為datetime64[ns]格式
            # Active 列應該是布爾值
            # 如果不做數據清洗,很難進行下一步的數據分析,為了進行數據格式的轉化,pandas里面有三種比較常用的方法
            # 1. astype()強制轉化數據類型
            # 2. 通過創建自定義的函數進行數據轉化
            # 3. pandas提供的to_nueric()以及to_datetime()
            

            <class 'pandas.core.frame.DataFrame'>
            RangeIndex: 5 entries, 0 to 4
            Data columns (total 10 columns):
            Customer Number    5 non-null int64
            Customer Name      5 non-null object
            2016               5 non-null object
            2017               5 non-null object
            Percent Growth     5 non-null object
            Jan Units          5 non-null object
            Month              5 non-null int64
            Day                5 non-null int64
            Year               5 non-null int64
            Active             5 non-null object
            dtypes: int64(4), object(6)
            memory usage: 480.0+ bytes

            首先介紹最常用的astype()

            比如可以通過astype()將第一列的數據轉化為整數int類型

            df['Customer Number'].astype("int")
            # 這樣的操作并沒有改變原始的數據框,而只是返回的一個拷貝
            

            0     10002
            1    552278
            2     23477
            3     24900
            4    651029
            Name: Customer Number, dtype: int32

            # 想要真正的改變數據框,通常需要通過賦值來進行,比如
            df["Customer Number"] = df["Customer Number"].astype("int")
            print(df)
            print("--------"*10)
            print(df.dtypes)
            

               Customer Number     Customer Name          2016            2017  \
            0            10002  Quest Industries  $125,000.00     $162,500.00   
            1           552278    Smith Plumbing  $920,000.00   $1,012,000.00   
            2            23477   ACME Industrial   $50,000.00      $62,500.00   
            3            24900        Brekke LTD  $350,000.00     $490,000.00   
            4           651029         Harbor Co   $15,000.00      $12,750.00   

              Percent Growth Jan Units  Month  Day  Year Active 
            0         30.00%       500      1   10  2015      Y 
            1         10.00%       700      6   15  2014      Y 
            2         25.00%       125      3   29  2016      Y 
            3          4.00%        75     10   27  2015      Y 
            4        -15.00%    Closed      2    2  2014      N 
            --------------------------------------------------------------------------------
            Customer Number     int32
            Customer Name      object
            2016               object
            2017               object
            Percent Growth     object
            Jan Units          object
            Month               int64
            Day                 int64
            Year                int64
            Active             object
            dtype: object

            # 通過賦值在原始的數據框基礎上進行了數據轉化,可以重新看一下我們新生成的數據框
            print(df)
            

               Customer Number     Customer Name          2016            2017  \
            0            10002  Quest Industries  $125,000.00     $162,500.00   
            1           552278    Smith Plumbing  $920,000.00   $1,012,000.00   
            2            23477   ACME Industrial   $50,000.00      $62,500.00   
            3            24900        Brekke LTD  $350,000.00     $490,000.00   
            4           651029         Harbor Co   $15,000.00      $12,750.00   

              Percent Growth Jan Units  Month  Day  Year Active 
            0         30.00%       500      1   10  2015      Y 
            1         10.00%       700      6   15  2014      Y 
            2         25.00%       125      3   29  2016      Y 
            3          4.00%        75     10   27  2015      Y 
            4        -15.00%    Closed      2    2  2014      N 

            # 然后像2016,2017 Percent Growth,Jan Units 這幾列帶有特殊符號的object是不能直接通過astype("flaot)方法進行轉化的,
            # 這與python中的字符串轉化為浮點數,都要求原始的字符都只能含有數字本身,不能含有其他的特殊字符
            # 我們可以試著將將Active列轉化為布爾值,看一下到底會發生什么,五個結果全是True,說明并沒有起到什么作用
            #df["Active"].astype("bool")
            
            df['2016'].astype('float')
            
            ValueError                Traceback (most recent call last)
            
            <ipython-input-19-47cc9d68cd65> in <module>()
            ----> 1 df['2016'].astype('float')
            
            
            C:\Anaconda3\lib\site-packages\pandas\core\generic.py in astype(self, dtype, copy, raise_on_error, **kwargs)
              3052     # else, only a single dtype is given
              3053     new_data = self._data.astype(dtype=dtype, copy=copy,
            -> 3054                   raise_on_error=raise_on_error, **kwargs)
              3055     return self._constructor(new_data).__finalize__(self)
              3056 
            
            
            C:\Anaconda3\lib\site-packages\pandas\core\internals.py in astype(self, dtype, **kwargs)
              3187 
              3188   def astype(self, dtype, **kwargs):
            -> 3189     return self.apply('astype', dtype=dtype, **kwargs)
              3190 
              3191   def convert(self, **kwargs):
            
            
            C:\Anaconda3\lib\site-packages\pandas\core\internals.py in apply(self, f, axes, filter, do_integrity_check, consolidate, **kwargs)
              3054 
              3055       kwargs['mgr'] = self
            -> 3056       applied = getattr(b, f)(**kwargs)
              3057       result_blocks = _extend_blocks(applied, result_blocks)
              3058 
            
            
            C:\Anaconda3\lib\site-packages\pandas\core\internals.py in astype(self, dtype, copy, raise_on_error, values, **kwargs)
              459        **kwargs):
              460     return self._astype(dtype, copy=copy, raise_on_error=raise_on_error,
            --> 461               values=values, **kwargs)
              462 
              463   def _astype(self, dtype, copy=False, raise_on_error=True, values=None,
            
            
            C:\Anaconda3\lib\site-packages\pandas\core\internals.py in _astype(self, dtype, copy, raise_on_error, values, klass, mgr, **kwargs)
              502 
              503         # _astype_nansafe works fine with 1-d only
            --> 504         values = _astype_nansafe(values.ravel(), dtype, copy=True)
              505         values = values.reshape(self.shape)
              506 
            
            
            C:\Anaconda3\lib\site-packages\pandas\types\cast.py in _astype_nansafe(arr, dtype, copy)
              535 
              536   if copy:
            --> 537     return arr.astype(dtype)
              538   return arr.view(dtype)
              539 
            
            
            ValueError: could not convert string to float: '$15,000.00 '

            以上的問題說明了一些問題

            • 如果數據是純凈的數據,可以轉化為數字
            • astype基本也就是兩種用作,數字轉化為單純字符串,單純數字的字符串轉化為數字,含有其他的非數字的字符串是不能通過astype進行轉化的。
            • 需要引入其他的方法進行轉化,也就有了下面的自定義函數方法

            通過自定義函數清理數據

            通過下面的函數可以將貨幣進行轉化

            def convert_currency(var):
              """
              convert the string number to a float
              _ 去除$
              - 去除逗號,
              - 轉化為浮點數類型
              """
              new_value = var.replace(",","").replace("$","")
              return float(new_value)
            
            # 通過replace函數將$以及逗號去掉,然后字符串轉化為浮點數,讓pandas選擇pandas認為合適的特定類型,float或者int,該例子中將數據轉化為了float64
            # 通過pandas中的apply函數將2016列中的數據全部轉化
            df["2016"].apply(convert_currency)
            

            0    125000.0
            1    920000.0
            2     50000.0
            3    350000.0
            4     15000.0
            Name: 2016, dtype: float64

            # 當然可以通過lambda 函數將這個比較簡單的函數一行帶過
            df["2016"].apply(lambda x: x.replace(",","").replace("$","")).astype("float64")
            

            0    125000.0
            1    920000.0
            2     50000.0
            3    350000.0
            4     15000.0
            Name: 2016, dtype: float64

            #同樣可以利用lambda表達式將PercentGrowth進行數據清理
            df["Percent Growth"].apply(lambda x: x.replace("%","")).astype("float")/100
            

            0    0.30
            1    0.10
            2    0.25
            3    0.04
            4   -0.15
            Name: Percent Growth, dtype: float64

            # 同樣可以通過自定義函數進行解決,結果同上
            # 最后一個自定義函數是利用np.where() function 將Active 列轉化為布爾值。
            df["Active"] = np.where(df["Active"] == "Y", True, False)
            
            df["Active"]
            
            

            0     True
            1     True
            2     True
            3     True
            4    False
            Name: Active, dtype: bool

            # 此時可查看一下數據格式
            df["2016"]=df["2016"].apply(lambda x: x.replace(",","").replace("$","")).astype("float64")
            df["2017"]=df["2017"].apply(lambda x: x.replace(",","").replace("$","")).astype("float64")
            df["Percent Growth"]=df["Percent Growth"].apply(lambda x: x.replace("%","")).astype("float")/100
            df.dtypes
            

            Customer Number      int32
            Customer Name       object
            2016               float64
            2017               float64
            Percent Growth     float64
            Jan Units           object
            Month                int64
            Day                  int64
            Year                 int64
            Active                bool
            dtype: object

            # 再次查看DataFrame
            # 此時只有Jan Units中格式需要轉化,以及年月日的合并,可以利用pandas中自帶的幾個函數進行處理
            print(df)
            

               Customer Number     Customer Name      2016       2017  Percent Growth  \
            0            10002  Quest Industries  125000.0   162500.0            0.30  
            1           552278    Smith Plumbing  920000.0  1012000.0            0.10  
            2            23477   ACME Industrial   50000.0    62500.0            0.25  
            3            24900        Brekke LTD  350000.0   490000.0            0.04  
            4           651029         Harbor Co   15000.0    12750.0           -0.15  

              Jan Units  Month  Day  Year Active 
            0       500      1   10  2015   True 
            1       700      6   15  2014   True 
            2       125      3   29  2016   True 
            3        75     10   27  2015   True 
            4    Closed      2    2  2014  False 

            利用pandas中函數進行處理

            # pandas中pd.to_numeric()處理Jan Units中的數據
            pd.to_numeric(df["Jan Units"],errors='coerce').fillna(0)
            

            0    500.0
            1    700.0
            2    125.0
            3     75.0
            4      0.0
            Name: Jan Units, dtype: float64

            # 最后利用pd.to_datatime()將年月日進行合并
            pd.to_datetime(df[['Month', 'Day', 'Year']])
            

            0   2015-01-10
            1   2014-06-15
            2   2016-03-29
            3   2015-10-27
            4   2014-02-02
            dtype: datetime64[ns]

            # 做到這里不要忘記重新賦值,否則原始數據并沒有變化
            df["Jan Units"] = pd.to_numeric(df["Jan Units"],errors='coerce')
            df["Start_date"] = pd.to_datetime(df[['Month', 'Day', 'Year']])
            
            Customer Number Customer Name 2016 2017 Percent Growth Jan Units Month Day Year Active Start_date
            0 10002 Quest Industries 125000.0 162500.0 0.30 500.0 1 10 2015 True 2015-01-10
            1 552278 Smith Plumbing 920000.0 1012000.0 0.10 700.0 6 15 2014 True 2014-06-15
            2 23477 ACME Industrial 50000.0 62500.0 0.25 125.0 3 29 2016 True 2016-03-29
            3 24900 Brekke LTD 350000.0 490000.0 0.04 75.0 10 27 2015 True 2015-10-27
            4 651029 Harbor Co 15000.0 12750.0 -0.15 NaN 2 2 2014 False 2014-02-02
            df.dtypes

            Customer Number             int32
            Customer Name              object
            2016                      float64
            2017                      float64
            Percent Growth            float64
            Jan Units                 float64
            Month                       int64
            Day                         int64
            Year                        int64
            Active                       bool
            Start_date         datetime64[ns]
            dtype: object

            # 將這些轉化整合在一起
            def convert_percent(val):
              """
              Convert the percentage string to an actual floating point percent
              - Remove %
              - Divide by 100 to make decimal
              """
              new_val = val.replace('%', '')
              return float(new_val) / 100
            
            df_2 = pd.read_csv("sales_data_types.csv",dtype={"Customer_Number":"int"},converters={
              "2016":convert_currency,
              "2017":convert_currency,
              "Percent Growth":convert_percent,
              "Jan Units":lambda x:pd.to_numeric(x,errors="coerce"),
              "Active":lambda x: np.where(x=="Y",True,False)
            })
            
            
            df_2.dtypes
            

            Customer Number      int64
            Customer Name       object
            2016               float64
            2017               float64
            Percent Growth     float64
            Jan Units          float64
            Month                int64
            Day                  int64
            Year                 int64
            Active              bool
            dtype: object

            df_2

            Customer Number Customer Name 2016 2017 Percent Growth Jan Units Month Day Year Active
            0 10002 Quest Industries 125000.0 162500.0 0.30 500.0 1 10 2015 True
            1 552278 Smith Plumbing 920000.0 1012000.0 0.10 700.0 6 15 2014 True
            2 23477 ACME Industrial 50000.0 62500.0 0.25 125.0 3 29 2016 True
            3 24900 Brekke LTD 350000.0 490000.0 0.04 75.0 10 27 2015 True
            4 651029 Harbor Co 15000.0 12750.0 -0.15 NaN 2 2 2014 False

            至此,pandas里面數據類型目前還有timedelta以及category兩個,之后會著重介紹category類型,這是類型是參考了R中的category設計的,在pandas 0.16 之后添加的,之后還會根據需要進行整理pandas的常用方法。

            到此這篇關于pandas 數據類型轉換的實現的文章就介紹到這了,更多相關pandas 數據類型轉換內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

            相關文章

            • Python正則表達式分組概念與用法詳解

              Python正則表達式分組概念與用法詳解

              這篇文章主要介紹了Python正則表達式分組概念與用法,結合具體實例形式較為詳細的分析了Python正則表達式中分組、引用、斷言等概念與相關使用技巧,需要的朋友可以參考下
              2017-06-06
            • 在Django的View中使用asyncio的方法

              在Django的View中使用asyncio的方法

              這篇文章主要介紹了在Django的View中使用asyncio的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
              2019-07-07
            • opencv3/C++ 平面對象識別&透視變換方式

              opencv3/C++ 平面對象識別&透視變換方式

              今天小編就為大家分享一篇opencv3/C++ 平面對象識別&透視變換方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
              2019-12-12
            • opencv 圖像輪廓的實現示例

              opencv 圖像輪廓的實現示例

              這篇文章主要介紹了opencv 圖像輪廓的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
              2020-07-07
            • Python實現的NN神經網絡算法完整示例

              Python實現的NN神經網絡算法完整示例

              這篇文章主要介紹了Python實現的NN神經網絡算法,結合完整實例形式分析了Python使用numpy、matplotlib及sklearn模塊實現NN神經網絡相關算法實現技巧與操作注意事項,需要的朋友可以參考下
              2018-06-06
            • Python過濾掉numpy.array中非nan數據實例

              Python過濾掉numpy.array中非nan數據實例

              這篇文章主要介紹了Python過濾掉numpy.array中非nan數據實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
              2020-06-06
            • python實現音樂下載的統計

              python實現音樂下載的統計

              這篇文章主要為大家詳細介紹了python實現音樂下載的統計,具有一定的參考價值,感興趣的小伙伴們可以參考一下
              2018-06-06
            • Python格式化輸出%s和%d

              Python格式化輸出%s和%d

              本篇文章主要介紹了Python格式化輸出%s和%d的實例案例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
              2018-05-05
            • 如何在windows下安裝配置python工具Ulipad

              如何在windows下安裝配置python工具Ulipad

              這篇文章主要介紹了如何在windows下安裝配置python工具Ulipad,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
              2020-10-10
            • 詳解Numpy中的廣播原則/機制

              詳解Numpy中的廣播原則/機制

              這篇文章主要介紹了Numpy中的廣播原則/機制,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
              2018-09-09

            最新評論

            hao500彩票 www.nadabula.com:蒙山县| www.cheapvegasairfares.com:和龙市| www.phoenix-nr.com:泗水县| www.szqtouch.com:大新县| www.matthiasgille.com:大同市| www.telepoisson.com:延吉市| www.trsnspls.com:西青区| www.ebwww.com:那坡县| www.materialhandler.net:抚顺市| www.six-369.com:收藏| www.patrickcoxdna.com:安义县| www.morze-noclegi.com:陈巴尔虎旗| www.cp7172.com:蕲春县| www.chaletdemontagne.org:广德县| www.odnfz.com:双峰县| www.borrevannet.net:友谊县| www.gpswbz.com:卫辉市| www.dcwt.org:夹江县| www.512825.com:南投县| www.flooringhelper.com:怀仁县| www.baidu48.com:景宁| www.faisal1624.com:林口县| www.pobohn.com:正定县| www.mlrsyu.com:黄陵县| www.aggressive-lawyers.com:繁峙县| www.leying234.com:鹤岗市| www.fam-love.com:客服| www.shluma.cn:湖州市| www.hghx.org:建宁县| www.satext.com:城固县| www.9959gp.com:洪洞县| www.hg59789.com:汶上县| www.amirtarabarasia.com:长丰县| www.cocina-online.net:巫溪县| www.hg345999.com:苗栗县| www.waerdi.com:永泰县| www.maksoyun.com:乐业县| www.lts-portal.org:平果县| www.dolls-haven.com:凭祥市| www.tjgelidianqi.com:景东| www.mugua668.com:大兴区| www.nillinternational.com:霍林郭勒市| www.youjiataoci.com:海宁市| www.abgxx.com:江山市| www.gzjdvc.com:邵武市| www.yjkj1588.com:平顺县| www.africanshawlsupplier.com:宝坻区| www.hzjjqp.com:商丘市| www.hdygl.com:屏东市| www.ivagevana.com:翁源县| www.takethiscash.com:二连浩特市| www.kyouhu.com:东方市| www.020hpgl.com:江城| www.atiehnews.com:北宁市| www.myoldagehome.com:宝鸡市| www.zoneii.com:正宁县| www.ptchw.cn:渭南市| www.suncity233.com:呼和浩特市| www.01gyrc.com:溧水县| www.fw776.com:神农架林区| www.yzc833.com:金阳县| www.bikerzworld.com:固安县| www.taxisenbarcelona.com:六安市| www.therapy-space.com:革吉县| www.hsbeads.com:遵义市| www.diaosizz.com:静宁县| www.70088g.com:从江县| www.beautifulhealthyliving.com:呼图壁县| www.hithazaramovie.com:额尔古纳市| www.edcvanuatu.com:灵台县| www.cp5593.com:嘉定区| www.baby-photos.net:班戈县| www.sharansoft.com:慈溪市| www.4008557888.com:富平县| www.nation-wide-building.com:奉节县| www.thisissohot.com:博湖县| www.61e7.com:繁峙县| www.chungcuhanoimoi.net:怀化市| www.aaagascalculator.com:金平| www.yzabtattoo.com:淄博市| www.blackspaceidp.com:涪陵区| www.ydgongce.com:常宁市| www.panda-host.net:江孜县| www.91dudou.com:渑池县|