沉淀,再出發:python中的pandas包


沉淀,再出發:python中的pandas包

一、前言

    python中有很多的包,正是因為這些包工具才使得python能夠如此強大,無論是在數據處理還是在web開發,python都發揮着重要的作用,下面我們看一下python用於數據處理的pandas包以及相應的用法。

二、pandas的使用

     2.1、pandas簡介

    Numpy、Matplotlib,Pandas是Python科學計算的支柱。

   NumPy是Python語言的一個擴充程序庫。支持高級大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。Numpy內部解除了Python的PIL(全局解釋器鎖),運算效率極好,是大量機器學習框架的基礎庫!
全局解釋器鎖(Global Interpreter Lock)是計算機程序設計語言解釋器用於同步線程的工具,使得任何時刻僅有一個線程在執行
1、Python Data Analysis Library 或 pandas 是基於NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。Pandas 納入了大量庫和一些標准的數據模型,提供了高效地操作大型數據集所需的工具。pandas提供了大量能使我們快速便捷地處理數據的函數和方法。你很快就會發現,它是使Python成為強大而高效的數據分析環境的重要因素之一。 2、Pandas 是python的一個數據分析包,最初由AQR Capital Management於2008年4月開發,並於2009年底開源出來,目前由專注於Python數據包開發的PyData開發team繼續開發和維護,屬於PyData項目的一部分。Pandas最初被作為金融數據分析工具而開發出來,因此,pandas為時間序列分析提供了很好的支持。 Pandas的名稱來自於面板數據(panel data)
和python數據分析(data analysis)。panel data是經濟學中關於多維數據集的一個術語,在Pandas中也提供了panel的數據類型。 3、數據結構: Series:一維數組,與Numpy中的一維array類似。二者與Python基本的數據結構List也很相近,其區別是:List中的元素可以是不同的數據類型,而Array和Series中則只允許存儲相同的數據類型,這樣可以更有效的使用內存,提高運算效率。 Time-Series:以時間為索引的Series。 DataFrame:二維的表格型數據結構。很多功能與R中的data.frame類似。可以將DataFrame理解為Series的容器。以下的內容主要以DataFrame為主。 Panel :三維的數組,可以理解為DataFrame的容器。 Pandas 有兩種自己獨有的基本數據結構。讀者應該注意的是,它固然有着兩種數據結構,因為它依然是 Python 的一個庫,所以,Python 中有的數據類型在這里依然適用,也同樣還可以使用類自己定義數據類型。只不過,Pandas 里面又定義了兩種數據類型:Series 和 DataFrame,它們讓數據操作更簡單了。

      2.2、pandas的安裝

    首先還是使用pip這個包管理工具來下載並自動安裝pandas:

    Pandas基於兩種數據類型:Series與dataframe。

  一個series是一個一維的數據類型,其中每一個元素都有一個標簽。如果閱讀過關於Numpy的文章,就可以發現series類似於Numpy中元素帶標簽的數組。其中,標簽可以是數字或者字符串。
  一個dataframe是一個二維的表結構。Pandas的dataframe可以存儲許多種不同的數據類型,並且每一個坐標軸都有自己的標簽。你可以把它想象成一個series的字典項。

    2.3、Series

    之后我們打開python命令行來測試一下:導入pandas模塊並使用別名,以及導入Series模塊,以下使用基於本次導入。

from pandas import Series
import pandas as pd

    Series 就如同列表一樣,一系列數據,每個數據對應一個索引值。Series 就是“豎起來”的 list,這里,我們實質上創建了一個 Series 對象,這個對象當然就有其屬性和方法了。比如,下面的兩個屬性依次可以顯示 Series 對象的數據值和索引:

    列表的索引只能是從 0 開始的整數,Series 數據類型在默認情況下,其索引也是如此。不過,區別於列表的是,Series 可以自定義索引: 

    每個元素都有了索引,就可以根據索引操作元素了。Series 中,根據索引查看其值和修改其值:

    前面定義 Series 對象的時候,用的是列表,即 Series() 方法的參數中,第一個列表就是其數據值,如果需要定義 index,放在后面,依然是一個列表。除了這種方法之外,還可以用下面的方法定義 Series 對象:

    這時候,索引依然可以組裝成新的對象,Pandas 的優勢在這里體現出來,如果自定義了索引,自定的索引會自動尋找原來的索引,如果一樣的,就取原來索引對應的值,這個可以簡稱為“自動對齊”,在 Pandas 中,如果沒有值,都對齊賦給 NaN。

    pandas有判斷是否為空的方法,此外,Series 對象也有同樣的方法:

      其實,對索引的名字,是可以重新定義的:

    對於 Series 數據,也可以做類似下面的運算:

     2.4、DataFrame

    DataFrame 是一種二維的數據結構,非常接近於電子表格或者類似 mysql 數據庫的形式。它的豎行稱之為 columns,橫行跟前面的 Series 一樣,稱之為 index,也就是說可以通過 columns 和 index 來確定一個主句的位置。

 

     使用 dict是定義一個 DataFrame 對象的常用方法。字典的“鍵”("name","marks","price")就是 DataFrame 的 columns 的值(名稱),字典中每個“鍵”的“值”是一個列表,它們就是那一豎列中的具體填充數據。上面的定義中沒有確定索引,所以,按照慣例(Series 中已經形成的慣例)就是從 0 開始的整數。從上面的結果中很明顯表示出來,這就是一個二維的數據結構。

     DataFrame 數據的索引也能夠自定義,定義 DataFrame 的方法,除了上面的之外,還可以使用“字典套字典”的方式。

 

    給同一列賦值:

    也可以單獨的賦值,除了能夠統一賦值之外,還能夠“點對點”添加數值,結合前面的 Series,既然 DataFrame 對象的每豎列都是一個 Series 對象,那么可以先定義一個 Series 對象,然后把它放到 DataFrame 對象中。如下:

     還可以更精准的修改數據,完全仿照字典的操作:

    上面的所有操作:

>>> from pandas import Series
>>> import pandas as pd
>>> s = Series([1,4,'ww','tt'])
>>> s
0     1
1     4
2    ww
3    tt
dtype: object
>>> s.index
RangeIndex(start=0, stop=4, step=1)
>>> s.values
array([1, 4, 'ww', 'tt'], dtype=object)
>>> s2 = Series(['zyr','man',24],index=['name','sex','age'])
>>> s2
name    zyr
sex     man
age      24
dtype: object
>>> s2['name']
'zyr'
>>> s2.name
>>> s2['name']='lsx'
>>> s2
name    lsx
sex     man
age      24
dtype: object
>>> sd = {'python':9000,'c++':9001,'c#':9000}
>>> sd
{'python': 9000, 'c++': 9001, 'c#': 9000}
>>> s3 = Series(sd)
>>> s3
python    9000
c++       9001
c#        9000
dtype: int64
>>> s4 = Series(sd,index=['java','c++','c#'])
>>> s4
java       NaN
c++     9001.0
c#      9000.0
dtype: float64
>>> pd.isnull(s4)
java     True
c++     False
c#      False
dtype: bool
>>> s4.isnull()
java     True
c++     False
c#      False
dtype: bool
>>> s4.index = ['語文','數學','English']
>>> s4
語文            NaN
數學         9001.0
English    9000.0
dtype: float64
>>> s4*2
語文             NaN
數學         18002.0
English    18000.0
dtype: float64
>>> s4[s4 > 9000]
數學    9001.0
dtype: float64
>>> from pandas import DataFrame
>>> data = {"name":['google','baidu','yahoo'],"marks":[100,200,300],"price":[1,2,3]}
>>> data
{'name': ['google', 'baidu', 'yahoo'], 'marks': [100, 200, 300], 'price': [1, 2, 3]}
>>> f1 = DataFrame(data)
>>> f1
     name  marks  price
0  google    100      1
1   baidu    200      2
2   yahoo    300      3
>>> f3 = DataFrame(data,columns=['name','marks','price'],index=['a','b','c'])
>>> f3
     name  marks  price
a  google    100      1
b   baidu    200      2
c   yahoo    300      3
>>> newdata = {'lang':{'first':'python','second':'java'},'price':{'first':5000,'second':2000}}
>>> f4=DataFrame(newdata)
>>> f4
          lang  price
first   python   5000
second    java   2000
>>> newdata = {"lang":{"firstline":"python","secondline":"java"}, "price":{"firstline":8000}}
>>> f4 = DataFrame(newdata)
>>> f4
              lang   price
firstline   python  8000.0
secondline    java     NaN
>>> f3['name']
a    google
b     baidu
c     yahoo
Name: name, dtype: object
>>> newdata1 = {'username':{'first':'wangxing','second':'dadiao'},'age':{'first':24,'second':25}}
>>> f6 = DataFrame(newdata1,columns=['username','age','sex'])
>>> f6
        username  age  sex
first   wangxing   24  NaN
second    dadiao   25  NaN
>>> f6['sex'] = 'man'
>>> f6
        username  age  sex
first   wangxing   24  man
second    dadiao   25  man
>>> ssex = Series(['',''],index=['first','second'])
>>> ssex
first     男
second    女
dtype: object
>>> f6['sex'] = ssex
>>> f6
        username  age sex
first   wangxing   24   男
second    dadiao   25>>> f6['age']['second'] = 30
__main__:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
>>> f6
        username  age sex
first   wangxing   24   男
second    dadiao   30   女
View Code

三、pandas的綜合應用

    3.1、讀取文件

    pandas更強大的是對文件(.xlsx,csv)的讀取(可以從本地和遠程讀取)和使用:

   注意:這里讀取.xlsx需要使用pd.read_excel(文件名),安裝依賴xlrd

1 >>> import pandas as pd 2 >>> import numpy as np 3 >>> data_url = "https://raw.githubusercontent.com/alstat/Analysis-with-Programming/master/2014/Python/Numerical-Descriptions-of-the-Data/data.csv" 4 >>> df = pd.read_csv(data_url)

    csv和xlsx分別用read_csv和read_xlsx
   查看數據df.head() :默認出5行,​括號里可以填其他數據
   查看數據類型:df.dtypes

   查看基本統計量:
      df.describe(include='all')

 

     打印行列,以及數據轉置:

    定位以及取出部分數據:

    舍棄某些列,axis 參數告訴函數到底舍棄列還是行。如果axis等於0,那么就舍棄行。

    3.2、可視化

 1 >>> import numpy as np  2 >>> import matplotlib.pyplot as plt  3 >>> x = np.array([1,2,3,4,5,6,7,8])  4 >>> x  5 array([1, 2, 3, 4, 5, 6, 7, 8])  6 >>> y = np.array([3,5,7,6,2,6,10,15])  7 >>> y  8 array([ 3,  5,  7,  6,  2,  6, 10, 15])  9 >>> plt.plot(x,y,'r') 10 [<matplotlib.lines.Line2D object at 0x000001B31E98EC50>] 11 >>> plt.plot(x,y,'g',lw=10) 12 [<matplotlib.lines.Line2D object at 0x000001B31BD642B0>] 13 >>> plt.bar(x,y,0.2,alpha=1,color='b') 14 <BarContainer object of 8 artists>
15 >>> plt.show()

 

1 >>> import pandas as pd
2 >>> data_url = "https://raw.githubusercontent.com/alstat/Analysis-with-Programming/master/2014/Python/Numerical-Descriptions-of-the-Data/data.csv"
3 >>> df = pd.read_csv(data_url)
4 >>> import matplotlib.pyplot as plt
5 >>> df.plot(kind = 'box')
6 <matplotlib.axes._subplots.AxesSubplot object at 0x000001D6AE0849B0>
7 >>> plt.show(df.plot(kind = 'box'))

四、幾種python的解釋器

       Python解釋器或Python虛擬機有很多種實現,有CPython、PyPy、Jython以及IronPython等。CPython是最主流的實現。CPython同時也是別的虛擬機實現的參考解釋器。PyPy是用Python實現的Python解釋器,Jython是用Java實現運行在JVM上的解釋器,IronPython是用Microsoft.NET CLR實現的解釋器。除非解釋器的選擇非常非常重要,我們一般都用CPython。
    CPython是用C語言實現Pyhon,是目前應用最廣泛的解釋器。Python最新的語言特性都是在這個上面先實現,Linux,OS X等自帶的也是這個版本,包括Anaconda里面用的也是CPython。CPython是官方版本加上對於C/Python API的全面支持,基本包含了所有第三方庫支持,例如Numpy,Scipy等。但是CPython有幾個缺陷,一是全局鎖使Python在多線程效能上表現不佳,二是CPython無法支持JIT(即時編譯),導致其執行速度不及Java和Javascipt等語言。於是出現了Pypy。
    Pypy是用Python自身實現的解釋器。針對CPython的缺點進行了各方面的改良,性能得到很大的提升。最重要的一點就是Pypy集成了JIT。但是,Pypy無法支持官方的C/Python API,導致無法使用例如Numpy,Scipy等重要的第三方庫,這也是現在Pypy沒有被廣泛使用的原因。

五、總結

    通過對pandas的學習,我們知道了很多的常用工具,基本語法,數據結構,繪圖工具以及使用方法。

參考文獻:https://www.cnblogs.com/misswangxing/p/7903595.html

參考文獻:https://blog.csdn.net/qq_26591517/article/details/80041296


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM