日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 模块之科学计算 Pandas

發(fā)布時間:2023/12/20 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 模块之科学计算 Pandas 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

一、Pandas簡介

數(shù)據(jù)結(jié)構(gòu)

二、Series

series 的創(chuàng)建

Series值的獲取

Series的運算

Series缺失值檢測

Series自動對齊

Series及其索引的name屬性

三、DataFrame

創(chuàng)建

Index對象

通過索引值或索引標簽獲取數(shù)據(jù)

自動化對齊

四、文件操作

文件讀取

數(shù)據(jù)庫數(shù)據(jù)讀取

將數(shù)據(jù)寫出為csv

將數(shù)據(jù)寫出為excel

將數(shù)據(jù)寫入數(shù)據(jù)庫

五、查詢數(shù)據(jù)

通過布爾索引來實現(xiàn)特定信息的查詢

六、統(tǒng)計分析

七、類似于SQL的操作

增:

改:

分組聚合:groupby()函數(shù)

?排序:

多表連接:

八、缺失值處理

刪除法:直接刪除缺失值

用常數(shù)填補所有缺失值

采用前項填充或后向填充

使用常量填充不同的列

用均值或中位數(shù)填充各自的列

九、數(shù)據(jù)透視表

多層索引的使用


Numpy,Scipy,pandas三個庫的區(qū)別

  • NumPy:數(shù)學(xué)計算庫,以矩陣為基礎(chǔ)的數(shù)學(xué)計算模塊,包括基本的四則運行,方程式以及其他方面的計算什么的,純數(shù)學(xué);
  • SciPy :科學(xué)計算庫,有一些高階抽象和物理模型,在NumPy基礎(chǔ)上,封裝了一層,沒有那么純數(shù)學(xué),提供方法直接計算結(jié)果;比如:做個傅立葉變換,這是純數(shù)學(xué)的,用Numpy;做個濾波器,這屬于信號處理模型了,用Scipy。
  • Pandas:提供名為DataFrame的數(shù)據(jù)結(jié)構(gòu),比較契合統(tǒng)計分析中的表結(jié)構(gòu),做數(shù)據(jù)分析用的,主要是做表格數(shù)據(jù)呈現(xiàn)。

目前來說,隨著 Pandas 更新,Numpy 大部分功能已經(jīng)直接和 Pandas 融合了。

一、Pandas簡介

Python Data Analysis Library 或 pandas 是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。Pandas 納入了大量庫和一些標準的數(shù)據(jù)模型,提供了高效地操作大型數(shù)據(jù)集所需的工具。pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。你很快就會發(fā)現(xiàn),它是使Python成為強大而高效的數(shù)據(jù)分析環(huán)境的重要因素之一。

Pandas是python的一個數(shù)據(jù)分析包,最初由AQR Capital Management于2008年4月開發(fā),并于2009年底開源出來,目前由專注于Python數(shù)據(jù)包開發(fā)的PyData開發(fā)team繼續(xù)開發(fā)和維護,屬于PyData項目的一部分。Pandas最初被作為金融數(shù)據(jù)分析工具而開發(fā)出來,因此,pandas為時間序列分析提供了很好的支持。 Pandas的名稱來自于面板數(shù)據(jù)(panel data)和python數(shù)據(jù)分析(data analysis)。panel data是經(jīng)濟學(xué)中關(guān)于多維數(shù)據(jù)集的一個術(shù)語,在Pandas中也提供了panel的數(shù)據(jù)類型。

數(shù)據(jù)結(jié)構(gòu)

  • Series:一維數(shù)組,與Numpy中的一維array類似。二者與Python基本的數(shù)據(jù)結(jié)構(gòu)List也很相近,其區(qū)別是:List中的元素可以是不同的數(shù)據(jù)類型,而Array和Series中則只允許存儲相同的數(shù)據(jù)類型,這樣可以更有效的使用內(nèi)存,提高運算效率。
  • Time- Series:以時間為索引的Series。
  • DataFrame:二維的表格型數(shù)據(jù)結(jié)構(gòu)。很多功能與R中的data.frame類似。可以將DataFrame理解為Series的容器。以下的內(nèi)容主要以DataFrame為主。
  • Panel :三維的數(shù)組,可以理解為DataFrame的容器。

Pandas 有兩種自己獨有的基本數(shù)據(jù)結(jié)構(gòu)。雖然它有著兩種數(shù)據(jù)結(jié)構(gòu),但它依然是 Python 的一個庫,所以,Python 中有的數(shù)據(jù)類型在這里依然適用,也同樣還可以使用類自己定義數(shù)據(jù)類型。只不過,Pandas 里面又定義了兩種數(shù)據(jù)類型:Series 和 DataFrame,它們讓數(shù)據(jù)操作更簡單了。

二、Series

Series 在python的中type()為 <class 'pandas.core.series.Series'>

series 的創(chuàng)建

  • 通過一維數(shù)組創(chuàng)建,如果沒有為數(shù)據(jù)指定索引值,會自動創(chuàng)建一個0-N-1的索引
  • 通過字典的方式創(chuàng)建,字典的key為索引
# series 的創(chuàng)建:數(shù)組方式 arr=np.array([1,3,5,np.NaN,10]) ser1=pd.Series(arr) print(ser1) print(ser1.dtype) # 獲取series的元素的數(shù)據(jù)類型 print(ser1.index) # 獲取series的索引 print(ser1.values) # 獲取series的值 0 ? ? 1.0 1 ? ? 3.0 2 ? ? 5.0 3 ? ? NaN 4 ? ?10.0 dtype: float64 float64 RangeIndex(start=0, stop=5, step=1) [ ?1. ? 3. ? 5. ?nan ?10.]# 通過index修改索引值,且索引值可以重復(fù) ser2=pd.Series([98,99,90]) ser2.index=['語文','數(shù)學(xué)','語文'] print(ser2) ser3=pd.Series(data=[99,98,97],dtype=np.float64,index=['語文','數(shù)學(xué)','歷史']) print(ser3) 語文 ? ?98 數(shù)學(xué) ? ?99 語文 ? ?90 dtype: int64 語文 ? ?99.0 數(shù)學(xué) ? ?98.0 歷史 ? ?97.0 dtype: float64# 通過字典的方式創(chuàng)建series,字典的key為series的索引值,字典的values為series的元素值 dit={'語文':90,'數(shù)學(xué)':99,'歷史':98} ser4=pd.Series(dit) print(ser4) 歷史 ? ?98 數(shù)學(xué) ? ?99 語文 ? ?90 dtype: int64

Series值的獲取

Series值的獲取主要有兩種方式:

  • 通過方括號+索引的方式讀取對應(yīng)索引的數(shù)據(jù),有可能返回多條數(shù)據(jù)
  • 通過方括號+下標值的方式讀取對應(yīng)下標值的數(shù)據(jù),下標值的取值范圍為:[0,len(Series.values)];另外下標值也可 以是負數(shù),表示從右往左獲取數(shù)據(jù)
  • Series獲取多個值的方式類似NumPy中的ndarray的切片操作,通過方括號+下標值/索引值+冒號(:)的形式來截取series對象中的一部分數(shù)據(jù)!

    # Series數(shù)據(jù)的獲取:下標值、索引值、切片 print('==============ser4[1]==============') print(ser4[1]) print('==============ser4["語文"]=========') print(ser4["語文"]) print('==============ser4[0:2]============') print(ser4[0:2]) print("==============ser4['歷史':'語文']===") print(ser4['歷史':'語文']) ==============ser4[1]============== 99 ==============ser4["語文"]========= 90 ==============ser4[0:2]============ 歷史 ? ?98 數(shù)學(xué) ? ?99 dtype: int64 ==============ser4[u'歷史':u'語文']=== 歷史 ? ?98 數(shù)學(xué) ? ?99 語文 ? ?90 dtype: int64

    Series的運算

    NumPy中的數(shù)組運算,在Series中都保留了,均可以使用,并且Series進行數(shù)組運算的時候,索引與值之間的映射關(guān)系不會發(fā)生改變。

    注意:其實在操作Series的時候,基本上可以把Series看成NumPy中的ndarray數(shù)組來進行操作。ndarray數(shù)組的絕大多數(shù)操作都可以應(yīng)用到Series上。

    # series的部分運算 print('==============ser4[ser4>98] 布爾運算=========') print(ser4[ser4>98]) print('==============ser4/9 除法運算================') print(ser4/9) print('==============np.exp(ser4) e的x次方==========') print(np.exp(ser4)) print('==============np.log10(ser4) ? ========') print(np.log10(ser4)) ==============ser4[ser4>98] 布爾運算========= 數(shù)學(xué) ? ?99 dtype: int64 ==============ser4/9 除法運算================ 歷史 ? ?10.888889 數(shù)學(xué) ? ?11.000000 語文 ? ?10.000000 dtype: float64 ==============np.exp(ser4) e的x次方========== 歷史 ? ?3.637971e+42 數(shù)學(xué) ? ?9.889030e+42 語文 ? ?1.220403e+39 dtype: float64 ==============np.log10(ser4) ? ======== 歷史 ? ?1.991226 數(shù)學(xué) ? ?1.995635 語文 ? ?1.954243 dtype: float64# 在pandas中用NaN表示一個缺省值或者NA值 print('==============ser4================') print(ser4) ser5=pd.Series(ser4,index=['地理','語文','歷史','數(shù)學(xué)']) print('==============ser5================') print(ser5) ==============ser4================ 歷史 ? ?98 數(shù)學(xué) ? ?99 語文 ? ?90 dtype: int64 ==============ser5================ 地理 ? ? NaN 語文 ? ?90.0 歷史 ? ?98.0 數(shù)學(xué) ? ?99.0 dtype: float64

    Series缺失值檢測

    pandas中的isnull和notnull兩個函數(shù)可以用于在Series中檢測缺失值,這兩個函數(shù)的返回時一個布爾類型的Series

    print('==============pd.isnull(ser5)================') print(pd.isnull(ser5)) print('==============ser5[pd.isnull(ser5)]===========') print(ser5[pd.isnull(ser5)]) print('==============pd.notnull(ser5)================') print(pd.notnull(ser5)) print('==============ser5[pd.notnull(ser5)]==========') print(ser5[pd.notnull(ser5)]) ==============pd.isnull(ser5)================ 地理 ? ? True 語文 ? ?False 歷史 ? ?False 數(shù)學(xué) ? ?False dtype: bool ==============ser5[pd.isnull(ser5)]=========== 地理 ? NaN dtype: float64 ==============pd.notnull(ser5)================ 地理 ? ?False 語文 ? ? True 歷史 ? ? True 數(shù)學(xué) ? ? True dtype: bool ==============ser5[pd.notnull(ser5)]========== 語文 ? ?90.0 歷史 ? ?98.0 數(shù)學(xué) ? ?99.0 dtype: float64

    Series自動對齊

    當多個series對象之間進行運算的時候,如果不同series之間具有不同的索引值,那么運算會自動對齊不同索引值的數(shù)據(jù),如果某個series沒有某個索引值,那么最終結(jié)果會賦值為NaN。

    ser6=pd.Series(data=[99,98,97],index=['語文','數(shù)學(xué)','歷史']) ser7=pd.Series(data=[99,98,97,100],index=['語文','數(shù)學(xué)','歷史','文言文']) print('==============ser6+ser7================') print(ser6+ser7) print('==============ser6-ser7================') print(ser6-ser7) print('==============ser6*ser7================') print(ser6*ser7) print('==============ser6/ser7================') print(ser6/ser7) print('==============ser6**ser7================') print(ser6**ser7) ==============ser6+ser7================ 歷史 ? ? 194.0 數(shù)學(xué) ? ? 196.0 文言文 ? ? ?NaN 語文 ? ? 198.0 dtype: float64 ==============ser6+ser7================ 歷史 ? ? 0.0 數(shù)學(xué) ? ? 0.0 文言文 ? ?NaN 語文 ? ? 0.0 dtype: float64 ==============ser6+ser7================ 歷史 ? ? 9409.0 數(shù)學(xué) ? ? 9604.0 文言文 ? ? ? NaN 語文 ? ? 9801.0 dtype: float64 ==============ser6+ser7================ 歷史 ? ? 1.0 數(shù)學(xué) ? ? 1.0 文言文 ? ?NaN 語文 ? ? 1.0 dtype: float64 ==============ser6+ser7================ 歷史 ? ? 5.210246e+192 數(shù)學(xué) ? ? 1.380878e+195 文言文 ? ? ? ? ? ? ?NaN 語文 ? ? 3.697296e+197 dtype: float64

    Series及其索引的name屬性

    Series對象本身以及索引都具有一個name屬性,默認為空,根據(jù)需要可以進行賦值操作

    ser8=pd.Series(data=[99,98,97],index=['Dov','Drld','Heil']) ser8.name='語文' ser8.index.name='考試成績' # 像不像索引的列名 print(ser8) 考試成績 Dov ? ? 99 Drld ? ?98 Heil ? ?97 Name: 語文, dtype: int64

    三、DataFrame

    創(chuàng)建

    DateFrame 在python的中type()為 <class 'pandas.core.frame.DataFrame'>

    DateFrame的創(chuàng)建主要有三種方式:

    1)通過二維數(shù)組創(chuàng)建數(shù)據(jù)框

    arr2 = np.array(np.arange(16)).reshape(4,4) df1 = pd.DataFrame(arr2)0? ?1? ?2? ?3 0 0? ?1? ?2? ?3 1 4? ?5? ?6? ?7 2 8? ?9? ?10 11 3 12 13? 14 15

    從這個輸出我們可以看到,默認的索引和列名都是[0, N-1]的形式。我們可以在創(chuàng)建DataFrame的時候指定列名和索引,像這樣:

    df2 = pd.DataFrame(np.arange(16).reshape(4,4),columns=["column1", "column2", "column3", "column4"],index=["a", "b", "c", "d"]) print("df2:\n{}\n".format(df2)) # 結(jié)果如下column1 column2 column3 column4 a 0? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? 2? ? ? ? ? ? ? ?3 b 4? ? ? ? ? ? ? 5? ? ? ? ? ? ? ?6? ? ? ? ? ? ? ?7 c 8? ? ? ? ? ? ? 9? ? ? ? ? ? ? ? 10? ? ? ? ? ? ? 11 d 12? ? ? ? ? ? 13? ? ? ? ? ? ? ?14? ? ? ? ? ? 15

    請注意:DataFrame的不同列可以是不同的數(shù)據(jù)類型。如果以Series數(shù)組來創(chuàng)建DataFrame,每個Series將成為一行,而不是一列,例如:

    noteSeries = pd.Series(["C", "D", "E", "F", "G", "A", "B"],index=[1, 2, 3, 4, 5, 6, 7]) weekdaySeries = pd.Series(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],index=[1, 2, 3, 4, 5, 6, 7]) df4 = pd.DataFrame([noteSeries, weekdaySeries]) print("df4:\n{}\n".format(df4)) # df4的輸出如下:1 2 3 4 5 6 7 0 C D E F G A B 1 Mon Tue Wed Thu Fri Sat Sun

    2)通過字典的方式創(chuàng)建數(shù)據(jù)框

    以下以兩種字典來創(chuàng)建數(shù)據(jù)框,一個是字典列表,一個是嵌套字典。

    dic2 = {'a':[1,2,3,4],'b':[5,6,7,8],'c':[9,10,11,12],'d':[13,14,15,16]} df2 = pd.DataFrame(dic2) dic3 = {'one':{'a':1,'b':2,'c':3,'d':4},'two':{'a':5,'b':6,'c':7,'d':8},'three':{'a':9,'b':10,'c':11,'d':12}} df3 = pd.DataFrame(dic3)# 結(jié)果如下:a b c d 0 1 5 9 13 1 2 6 10 14 2 3 7 11 15 3 4 8 12 16one two three a 1 5 9 b 2 6 10 c 3 7 11 d 4 8 12

    字典的“鍵”("name","marks","price")就是 DataFrame 的 columns 的值(名稱),字典中每個“鍵”的“值”是一個列表,它們就是那一豎列中的具體填充數(shù)據(jù)。

    上面的dic2定義中沒有確定索引,所以,按照慣例(Series 中已經(jīng)形成的慣例)就是從 0 開始的整數(shù)。從上面的結(jié)果中很明顯表示出來,這就是一個二維的數(shù)據(jù)結(jié)構(gòu)(類似 excel 或者 mysql 中的查看效果)。

    上面的數(shù)據(jù)顯示中,columns 的順序沒有規(guī)定,就如同字典中鍵的順序一樣,但是在 DataFrame 中,columns 跟字典鍵相比,有一個明顯不同,就是其順序可以被規(guī)定,比如:

    dic2_1 = DataFrame(dic2,columns=['b','a','c','d'])

    Index對象

    通過索引值或索引標簽獲取數(shù)據(jù)

    pandas的Index對象包含了描述軸的元數(shù)據(jù)信息。當創(chuàng)建Series或者DataFrame的時候,標簽的數(shù)組或者序列會被轉(zhuǎn)換成Index。可以通過下面的方式獲取到DataFrame的列和行的Index對象:

    dic3 = {'one':{'a':1,'b':2,'c':3,'d':4},'two':{'a':5,'b':6,'c':7,'d':8},'three':{'a':9,'b':10,'c':11,'d':12}} df3 = pd.DataFrame(dic3) print(df3.columns) # 輸出:Index(['one', 'two', 'three'], dtype='object') print(df3.index) # 輸出:Index(['a', 'b', 'c', 'd'], dtype='object')

    Index并非集合,因此其中可以包含重復(fù)的數(shù)據(jù)

    Index對象的值是不可以改變,因此可以通過它安全的訪問數(shù)據(jù)

    DataFrame提供了下面兩個操作符來訪問其中的數(shù)據(jù):

    print(df3[['one','two']]) # df3[列索引] print(df3.loc[['a','b'], ['one','two']]) # loc[行索引,列索引] print(df3.iloc[[0, 1], 0]) # iloc[行下標,列下標]# 第二行代碼訪問了行索引為a和b,列索引為'one','two'的元素。第三行代碼訪問了行下標為0和1(對于df3來說,行索引和行下標剛好是一樣的,所以這里都是0和1,但它們卻是不同的含義),列下標為0的元素。one two a 1 5 b 2 6 c 3 7 d 4 8one two a 1 5 b 2 6a 1 b 2 Name: one, dtype: int64

    自動化對齊

    如果有兩個序列,需要對這兩個序列進行算術(shù)運算,這時索引的存在就體現(xiàn)的它的價值了—自動化對齊.

    s5 = pd.Series(np.array([10,15,20,30,55,80]),index = ['a','b','c','d','e','f']) s6 = pd.Series(np.array([12,11,13,15,14,16]),index = ['a','c','g','b','d','f']) s5 + s6 s5/s6 # 結(jié)果如下 a 22.0 b 30.0 c 31.0 d 44.0 e NaN f 96.0 g NaN dtype: float64a 0.833333 b 1.000000 c 1.818182 d 2.142857 e NaN f 5.000000 g NaN dtype: float64

    由于s5中沒有對應(yīng)的g索引,s6中沒有對應(yīng)的e索引,所以數(shù)據(jù)的運算會產(chǎn)生兩個缺失值NaN。注意,這里的算術(shù)結(jié)果就實現(xiàn)了兩個序列索引的自動對齊,而非簡單的將兩個序列加總或相除。對于數(shù)據(jù)框的對齊,不僅僅是行索引的自動對齊,同時也會自動對齊列索引(變量名)

    DataFrame中同樣有索引,而且DataFrame是二維數(shù)組的推廣,所以其不僅有行索引,而且還存在列索引,關(guān)于數(shù)據(jù)框中的索引相比于序列的應(yīng)用要強大的多,這部分內(nèi)容將放在數(shù)據(jù)查詢中講解。

    四、文件操作

    文件讀取

    pandas庫提供了一系列的read_函數(shù)來讀取各種格式的文件,它們?nèi)缦滤?#xff1a;

    • read_csv
    • read_table
    • read_fwf
    • read_clipboard
    • read_excel
    • read_hdf
    • read_html
    • read_json
    • read_msgpack
    • read_pickle
    • read_sas
    • read_sql
    • read_stata
    • read_feather

    接下來我們看一個讀取Excel的簡單的例子:

    import pandas as pd import numpy as np df1 = pd.read_excel("data/test.xlsx") print("df1:\n{}\n".format(df1)) # 這個Excel的內(nèi)容如下: df1: C Mon 0 D Tue 1 E Wed 2 F Thu 3 G Fri ...

    我們再來看讀取CSV文件的例子,

    df2 = pd.read_csv("data/test1.csv") print("df2:\n{}\n".format(df2)) # 結(jié)果如下 df2: C,Mon D,Tue E,Wed F,Thu ...

    如果分隔符不是,我們可以通過指定分隔符的方式來讀取這個文件,像這樣:

    df3 = pd.read_csv("data/test2.csv", sep="|")

    read_csv支持非常多的參數(shù)用來調(diào)整讀取的參數(shù),如下表所示:

    參數(shù)說明
    path文件路徑
    sep或者delimiter字段分隔符
    header列名的行數(shù),默認是0(第一行)
    index_col列號或名稱用作結(jié)果中的行索引
    names結(jié)果的列名稱列表
    skiprows從起始位置跳過的行數(shù)
    na_values代替NA的值序列
    comment以行結(jié)尾分隔注釋的字符
    parse_dates嘗試將數(shù)據(jù)解析為datetime。默認為False
    keep_date_col如果將列連接到解析日期,保留連接的列。默認為False。
    converters列的轉(zhuǎn)換器
    dayfirst當解析可以造成歧義的日期時,以內(nèi)部形式存儲。默認為False
    data_parser用來解析日期的函數(shù)
    nrows從文件開始讀取的行數(shù)
    iterator返回一個TextParser對象,用于讀取部分內(nèi)容
    chunksize指定讀取塊的大小
    skip_footer文件末尾需要忽略的行數(shù)
    verbose輸出各種解析輸出的信息
    encoding文件編碼
    squeeze如果解析的數(shù)據(jù)只包含一列,則返回一個Series
    thousands千數(shù)量的分隔符

    詳細的read_csv函數(shù)說明請參見這里:pandas.read_csv

    注:UTF-8以字節(jié)為編碼單元,它的字節(jié)順序在所有系統(tǒng)中都是一様?shù)?#xff0c;沒有字節(jié)序的問題,也因此它實際上并不需要BOM(“ByteOrder Mark”)。但是UTF-8 with BOM即utf-8-sig需要提供BOM。簡單的說,utf-8-sig是對字節(jié)編碼有序的。
    這種情況發(fā)生在pandas在read csv的時候,如果報錯,

    key error,??File "pandas/index.pyx", line 137, in pandas.index.IndexEngine.get_loc (pandas/index.c:4154)
    File "pandas/index.pyx", line 159, in pandas.index.IndexEngine.get_loc (pandas/index.c:4018)
    File "pandas/hashtable.pyx", line 675, in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12368)
    File "pandas/hashtable.pyx", line 683, in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12322)

    這種情況要考慮使用utf-8-sig這種編碼,即encdoinf='utf-8-sig'遇到中文亂碼的時候也可以試試改成這個編碼

    數(shù)據(jù)庫數(shù)據(jù)讀取

    read_sql_query(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, chunksize=None)

    • sql:表示抽取數(shù)據(jù)的SQL語句,例如'select * from 表名'
    • con:表示數(shù)據(jù)庫連接的名稱
    • index_col:表示作為索引的列,默認為0-行數(shù)的等差數(shù)列

    read_sql_table(table_name, con, schema=None, index_col=None, coerce_float=True, parse_dates=None, columns=None, chunksize=None)

    • table_name:表示抽取數(shù)據(jù)的表名
    • con:表示數(shù)據(jù)庫連接的名稱
    • index_col:表示作為索引的列,默認為0-行數(shù)的等差數(shù)列
    • columns:數(shù)據(jù)庫數(shù)據(jù)讀取后的列名。

    read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)

    • sql:表示抽取數(shù)據(jù)的表名或者抽取數(shù)據(jù)的SQL語句,例如'select * from 表名'
    • con:表示數(shù)據(jù)庫連接的名稱
    • index_col:表示作為索引的列,默認為0-行數(shù)的等差數(shù)列
    • columns:數(shù)據(jù)庫數(shù)據(jù)讀取后的列名。

      建議:用前兩個

    # 讀取數(shù)據(jù)庫 from sqlalchemy import create_engine conn = create_engine('mysql+pymysql://root:root@127.0.0.1/test?charset=utf8', encoding='utf-8', echo=True) # data1 = pd.read_sql_query('select * from data', con=conn) # print(data1.head())data2 = pd.read_sql_table('data', con=conn) print(data2.tail()) print(data2['X'][1])

    數(shù)據(jù)庫連接字符串各參數(shù)說明

    'mysql+pymysql://root:root@127.0.0.1/test?charset=utf8' 連接器://用戶名:密碼@數(shù)據(jù)庫所在IP/訪問的數(shù)據(jù)庫名稱?字符集

    將數(shù)據(jù)寫出為csv

    DataFrame.to_csv(path_or_buf=None, sep=',', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, mode='w', encoding=None, compression=None, quoting=None, quotechar='"', line_terminator='\n', chunksize=None, tupleize_cols=False, date_format=None, doublequote=True, escapechar=None, decimal='.')

    • path_or_buf:數(shù)據(jù)存儲路徑,含文件全名例如'./data.csv'
    • sep:表示數(shù)據(jù)存儲時使用的分隔符
    • header:是否導(dǎo)出列名,True導(dǎo)出,False不導(dǎo)出
    • index: 是否導(dǎo)出索引,True導(dǎo)出,False不導(dǎo)出
    • mode:數(shù)據(jù)導(dǎo)出模式,'w'為寫
    • encoding:數(shù)據(jù)導(dǎo)出的編碼
    import pandas as pd data.to_csv('data.csv',index = False)

    將數(shù)據(jù)寫入數(shù)據(jù)庫

    DataFrame.to_sql(name, con, flavor=None, schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None)

    • name:數(shù)據(jù)存儲表名
    • con:表示數(shù)據(jù)連接
    • if_exists:判斷是否已經(jīng)存在該表,'fail'表示存在就報錯;'replace'表示存在就覆蓋;'append'表示在尾部追加
    • index: 是否導(dǎo)出索引,True導(dǎo)出,False不導(dǎo)出
    from sqlalchemy import create_engine conn =create_engine('mysql+pymysql://root:root@127.0.0.1/data?charset=utf8', encoding='utf-8', echo=True) data.to_sql('data',con = conn)

    五、查詢數(shù)據(jù)

    data.shape # 查看數(shù)據(jù)的形狀 data.columns # 查看所有的列名 data.index # 查看索引 data.dtypes # 查看每一列數(shù)據(jù)的類型 data.ndim # 查看數(shù)據(jù)的維度 # 查詢前幾行 或 后幾行 data.head(5) data.tail(5)# 注意當我們提取了一列,Pandas將返回一個series,而不是一個數(shù)組 data['X'] # 取出單獨某一列 data[['X','Y']] # 取出多列,如果多個列的話,必須使用雙重中括號 data['X'][1] # 取出某列的某一行 data['X'][:10] # 取出某列的某幾行 data[['X','Y']][:10] # 取出某幾列的某幾行# loc方法索引'''DataFrame.loc[行名,列名]''' data.loc[1,['X','月份']] # 取出某幾列的某一行 data.loc[1:5,['X','月份']] # 取出某幾列的某幾行(連續(xù)) data.loc[[1,3,5],['X','月份']] # 取出某幾列的某幾行 data.loc[range(0,21,2),['X','FFMC','DC']] # 取出 x ,FFMC ,DC的0-20行所有索引名稱為偶數(shù)的數(shù)據(jù)# iloc方法索引'''DataFrame.iloc[行位置,列位置]''' data.iloc[1,[1,4]] # 取出某幾列的某一行 data.iloc[0:21:2,0:data.shape[1]:2] # 取出列位置為偶數(shù),行位置為0-20的偶數(shù)的數(shù)據(jù)# ix方法索引'''DataFrame.ix[行位置/行名,列位置/列名]''' # 取出某幾列的某一行 data.ix[1:4,[1,4]] data.ix[1:4,1:4]

    loc,iloc,ix的區(qū)別

  • loc使用名稱索引,閉區(qū)間
  • iloc使用位置索引,前閉后開區(qū)間
  • ix使用名稱或位置索引,且優(yōu)先識別名稱,其區(qū)間根據(jù)名稱/位置來改變。不建議使用ix,容易發(fā)生混淆的情況,并且運行效率低于loc和iloc,pandas考慮在后期會移除這一索引方法
  • 通過布爾索引來實現(xiàn)特定信息的查詢

    student[student['sex'] == F] # 查詢所有性別為女生的信息 student[(student['sex'] == F) & (stuent['age'] > 18)] # 多條件查詢,查詢所有性別為女且年齡大于18歲的信息 student[(student['sex'] == F) & (stuent['age'] > 18)] [['name' , 'height']] # 查詢性別為女,年齡大于18的學(xué)生的姓名 和 體重

    六、統(tǒng)計分析

    pandas模塊為我們提供了非常多的描述性統(tǒng)計分析的指標函數(shù)

    對于DataFrame,默認統(tǒng)計的是列的數(shù)據(jù),如果想要統(tǒng)計行的,需要加axis=1

    np.random.seed(1234) d1 = pd.Series(2*np.random.normal(size = 100)+3) d2 = np.random.f(2,4,size = 100) d3 = np.random.randint(1,100,size = 100)d1.count() # 非空元素計算 d1.min() # 最小值 d1.max() # 最大值 d1.idxmin() # 最小值的位置,類似于R中的which.min函數(shù) d1.idxmax() # 最大值的位置,類似于R中的which.max函數(shù) d1.quantile(0.1) # 10%分位數(shù) d1.sum() # 求和 d1.mean() # 均值 d1.median()# 中位數(shù) d1.mode() # 眾數(shù) d1.var() # 方差 d1.std() # 標準差 d1.mad() # 平均絕對偏差 d1.skew() # 偏度 d1.kurt() # 峰度d1.sum() # 求和,默認列 d1.sum(axis=1) # 求和,行

    上述方法一維和二維均可用。

    # 一次性輸出多個描述性統(tǒng)計指標,descirbe方法只能針對序列或數(shù)據(jù)框,一維數(shù)組是沒有這個方法的 d1.describe() # student['Sex'].describe() ''' count:非空值的數(shù)目 mean:數(shù)值型數(shù)據(jù)的均值 std:數(shù)值型數(shù)據(jù)的標準差 min:數(shù)值型數(shù)據(jù)的最小值 25%:數(shù)值型數(shù)據(jù)的下四分位數(shù) 50%:數(shù)值型數(shù)據(jù)的中位數(shù) 75%:數(shù)值型數(shù)據(jù)的上四分位數(shù) max:數(shù)值型數(shù)據(jù)的最大值 ''

    ?

    相關(guān)系數(shù)(Correlation coefficient):反映兩個樣本/樣本之間的相互關(guān)系以及之間的相關(guān)程度。在COV的基礎(chǔ)上進行了無量綱化操作,也就是進行了標準化操作

    協(xié)方差(Covariance, COV):反映兩個樣本/變量之間的相互關(guān)系以及之間的相關(guān)程度。

    df.corr() # 相關(guān)系數(shù) df.cov() # 協(xié)方差 df.corr('spearman') # 相關(guān)系數(shù)的計算可以調(diào)用pearson方法或kendell方法或spearman方法,默認使用pearson方法 df.corrwith(df['x1']) # 如果只想關(guān)注某一個變量與其余變量的相關(guān)系數(shù)的話,可以使用corrwith,如下方只關(guān)心x1與其余變量的相關(guān)系數(shù)

    ?

    轉(zhuǎn)置

    df3.T

    對軸進行排序

    a.sort_index(axis=1,ascending=False); # 其中axis=1表示對所有的columns進行排序,下面的數(shù)也跟著發(fā)生移動。后面的ascending=False表示按降序排列,參數(shù)缺失時默認升序。

    對DataFrame中的值排序

    a.sort(columns='x') # 即對a中的x這一列,從小到大進行排序。注意僅僅是x這一列,而上面的按軸進行排序時會對所有的columns進行操作。

    unique方法用于獲取Series中的唯一值數(shù)組(去重數(shù)據(jù)后的數(shù)組)

    value_counts方法用于計算一個Series中各值的出現(xiàn)頻率

    isin方法用于判斷矢量化集合的成員資格,可用于選取Series中或者DataFrame中列中數(shù)據(jù)的子集

    # unique() 對于dataframe必須要指定是哪一列,對于series可以直接使用unique df7["數(shù)學(xué)"].unique() array([78, 89, 90], dtype=int64)# value_counts()對于dataframe必須要指定是哪一列,對于series可以直接使用value_counts df7["數(shù)學(xué)"].value_counts() 89 ? ?2 78 ? ?1 90 ? ?1 Name: 數(shù)學(xué), dtype: int64 mask=[89,90]print(df7.isin(mask)) print("========================================") print(df7[df7.isin(mask)])age ? ? 歷史 ? ? 數(shù)學(xué) ? ? 語文 one ? ?False ? True ?False ?False two ? ?False ?False ? True ?False three ?False ?False ? True ?False four ? False ?False ? True ? True ========================================age ? ?歷史 ? ?數(shù)學(xué) ? ?語文 one ? ?NaN ?90.0 ? NaN ? NaN two ? ?NaN ? NaN ?89.0 ? NaN three ?NaN ? NaN ?89.0 ? NaN four ? NaN ? NaN ?90.0 ?90.0

    七、類似于SQL的操作

    增:

    添加新行或增加新列.可以通過concat函數(shù)實現(xiàn) pd.contat([student,student2])

    在數(shù)據(jù)庫中union必須要求兩張表的列順序一致,而這里concat函數(shù)可以自動對齊兩個數(shù)據(jù)框的變量!

    對于新增的列沒有賦值,就會出現(xiàn)空NaN的形式。

    其他方式

    In [105]: data['new'] = 'token' # 增加列 In [106]: data Out[106]:name price new 0 BTC 50000 token 1 ETH 4000 token 2 EOS 150 tokenIn [109]: data.loc['3'] = ['ae',200,'token'] # 增加行 In [110]: data Out[110]:name price type 0 BTC 50000 token 1 ETH 4000 token 2 EOS 150 token 3 ae 200 token

    # 使用drop()。該方法返回的是Copy而不是視圖,要想真正在原數(shù)據(jù)里刪除行,設(shè)置inplace=True; # axis:0,表示刪除行;1,表示刪除列。 data.drop('列',axis=1,inplace=True) data.drop('行',axis=0,inplace=True)# del del data # 刪除對象,該命令可以刪除Python的所有對象 del data['type'] # 刪除列

    改:

    結(jié)合布爾索引直接賦值即可

    ?

    分組聚合:groupby()函數(shù)

    # 分組 group1 = data.groupby('性別') group2 = data.groupby(['入職時間','性別'])# 查看有多少組 group1.size()

    用groupby方法分組后的結(jié)果并不能直接查看,而是被存在內(nèi)存中,輸出的是內(nèi)存地址。實際上分組后的數(shù)據(jù)對 象GroupBy類似Series與DataFrame,是pandas提供的一種對象。?

    Groupby對象常見方法

    Grouped對象的agg方法

      Grouped.agg(函數(shù)或包含了字段名和函數(shù)的字典)

    # 第一種情況 group[['年齡','工資']].agg(min)# 對不同的列進行不同的聚合操作 group.agg({'年齡':max,'工資':sum})# 上述過程中使用的函數(shù)均為系統(tǒng)math庫所帶的函數(shù),若需要使用pandas的函數(shù)則需要做如下操作 group.agg({'年齡':lambda x:x.max(),'工資':lambda x:x.sum()})

    根據(jù)性別分組,計算各組別中學(xué)生身高和體重的平均值:

    如果不對原始數(shù)據(jù)作限制的話,聚合函數(shù)會自動選擇數(shù)值型數(shù)據(jù)進行聚合計算。如果不想對年齡計算平均值的話,就需要剔除改變量:

    groupby還可以使用多個分組變量,例如根本年齡和性別分組,計算身高與體重的平均值:

    還可以對每個分組計算多個統(tǒng)計量:


    排序:

    我們可以使用order、sort_index和sort_values實現(xiàn)序列和數(shù)據(jù)框的排序工作

    我們再試試降序排序的設(shè)置:

    上面兩個結(jié)果其實都是按值排序,并且結(jié)果中都給出了警告信息,即建議使用sort_values()函數(shù)進行按值排序。

    在數(shù)據(jù)框中一般都是按值排序,例如:

    多表連接:

    連接分內(nèi)連接和外連接,在數(shù)據(jù)庫語言中通過join關(guān)鍵字實現(xiàn),pandas我比較建議使用merger函數(shù)實現(xiàn)數(shù)據(jù)的各種連接操作。

    如下是構(gòu)造一張學(xué)生的成績表:

    現(xiàn)在想把學(xué)生表student與學(xué)生成績表score做一個關(guān)聯(lián),該如何操作呢?

    默認情況下,merge函數(shù)實現(xiàn)的是兩個表之間的內(nèi)連接,即返回兩張表中共同部分的數(shù)據(jù)。可以通過how參數(shù)設(shè)置連接的方式,left為左連接;right為右連接;outer為外連接。

    左連接實現(xiàn)的是保留student表中的所有信息,同時將score表的信息與之配對,能配多少配多少,對于沒有配對上的Name,將會顯示成績?yōu)镹aN。

    八、缺失值處理

    現(xiàn)實生活中的數(shù)據(jù)是非常雜亂的,其中缺失值也是非常常見的,對于缺失值的存在可能會影響到后期的數(shù)據(jù)分析或挖掘工作,那么我們該如何處理這些缺失值呢?常用的有三大類方法,即刪除法、填補法和插值法。

    • 刪除法:當數(shù)據(jù)中的某個變量大部分值都是缺失值,可以考慮刪除改變量;當缺失值是隨機分布的,且缺失的數(shù)量并不是很多是,也可以刪除這些缺失的觀測。
    • 替補法:對于連續(xù)型變量,如果變量的分布近似或就是正態(tài)分布的話,可以用均值替代那些缺失值;如果變量是有偏的,可以使用中位數(shù)來代替那些缺失值;對于離散型變量,我們一般用眾數(shù)去替換那些存在缺失的觀測。
    • 插補法:插補法是基于蒙特卡洛模擬法,結(jié)合線性模型、廣義線性模型、決策樹等方法計算出來的預(yù)測值替換缺失值。

    方法

    說明

    dropna

    根據(jù)標簽的值中是否存在缺失數(shù)據(jù)對軸標簽進行過濾(刪除), 可以通過閾值的調(diào)節(jié)對缺失值的容忍度

    fillna

    用指定值或者插值的方式填充缺失數(shù)據(jù),比如: ffill或者bfill

    isnull

    返回一個含有布爾值的對象,這些布爾值表示那些值是缺失值NA

    notnull

    isnull的否定式

    刪除法:直接刪除缺失值

    默認情況下,數(shù)據(jù)中只要含有缺失值NaN,該數(shù)據(jù)行就會被刪除,如果使用參數(shù)how=’all’,則表明只刪除所有行為缺失值的觀測。

    用常數(shù)填補所有缺失值

    采用前項填充或后向填充

    使用常量填充不同的列

    用均值或中位數(shù)填充各自的列

    很顯然,在使用填充法時,相對于常數(shù)填充或前項、后項填充,使用各列的眾數(shù)、均值或中位數(shù)填充要更加合理一點,這也是工作中常用的一個快捷手段。

    九、數(shù)據(jù)透視表

    在Excel中有一個非常強大的功能就是數(shù)據(jù)透視表,通過托拉拽的方式可以迅速的查看數(shù)據(jù)的聚合情況,這里的聚合可以是計數(shù)、求和、均值、標準差等。

    pandas為我們提供了非常強大的函數(shù)pivot_table(),該函數(shù)就是實現(xiàn)數(shù)據(jù)透視表功能的。對于上面所說的一些聚合函數(shù),可以通過參數(shù)aggfunc設(shè)定。我們先看看這個函數(shù)的語法和參數(shù)吧:

    我們?nèi)匀灰詓tudent表為例,來認識一下數(shù)據(jù)透視表pivot_table函數(shù)的用法:

    對一個分組變量(Sex),一個數(shù)值變量(Height)作統(tǒng)計匯總

    對一個分組變量(Sex),兩個數(shù)值變量(Height,Weight)作統(tǒng)計匯總

    對兩個分組變量(Sex,Age),兩個數(shù)值變量(Height,Weight)作統(tǒng)計匯總

    很顯然這樣的結(jié)果并不像Excel中預(yù)期的那樣,該如何變成列聯(lián)表的形式的?很簡單,只需將結(jié)果進行非堆疊操作(unstack)即可:

    使用多個聚合函數(shù)

    有關(guān)更多數(shù)據(jù)透視表的操作,可參考《Pandas透視表(pivot_table)詳解》一文,鏈接地址:http://python.jobbole.com/81212/

    多層索引的使用

    最后我們再來講講pandas中的一個重要功能,那就是多層索引。在序列中它可以實現(xiàn)在一個軸上擁有多個索引,就類似于Excel中常見的這種形式:

    對于這樣的數(shù)據(jù)格式有什么好處呢?pandas可以幫我們實現(xiàn)用低維度形式處理高維數(shù)數(shù)據(jù),這里舉個例子也許你就能明白了:

    對于這種多層次索引的序列,取數(shù)據(jù)就顯得非常簡單了:

    對于這種多層次索引的序列,我們還可以非常方便的將其轉(zhuǎn)換為數(shù)據(jù)框的形式:

    以上針對的是序列的多層次索引,數(shù)據(jù)框也同樣有多層次的索引,而且每條軸上都可以有這樣的索引,就類似于Excel中常見的這種形式:

    我們不妨構(gòu)造一個類似的高維數(shù)據(jù)框:

    同樣,數(shù)據(jù)框中的多層索引也可以非常便捷的取出大塊數(shù)據(jù):

    在數(shù)據(jù)框中使用多層索引,可以將整個數(shù)據(jù)集控制在二維表結(jié)構(gòu)中,這對于數(shù)據(jù)重塑和基于分組的操作(如數(shù)據(jù)透視表的生成)比較有幫助。
    就拿student二維數(shù)據(jù)框為例,我們構(gòu)造一個多層索引數(shù)據(jù)集:

    http://www.cnblogs.com/nxld/p/6058591.html

    https://www.cnblogs.com/lingLongBaby/p/7147378.html

    http://www.cnblogs.com/WoLykos/p/9349581.html

    https://www.cnblogs.com/zuizui1204/p/6423069.html

    總結(jié)

    以上是生活随笔為你收集整理的Python 模块之科学计算 Pandas的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。