文章目錄html
1、數據結構:Series和DataFramepython
2、數據導入和輸出json
二、導入csv文件數據結構
3、數據清洗函數
(2)在Alice以後插入新行:Brian 56 63 90
在數據分析工做中,Pandas使用頻率很高,一方面是由於Pandas提供的基礎數據結構DataFrame與JSON契合度高,轉換起來挺方便。另外一方面,對於不太複雜的平常數據清理工做,一般用幾句Pandas代碼就能夠對數據進行規整。
Pandas是基於NumPy構建的含有更高級數據結構和分析能力的工具包。NumPy中數據結構是圍繞ndarray展開的,Pandas的核心數據結構是Series(序列——一維序列結構)和DataFrame(數據幀——二維表結構)。基於這兩種數據結構,Pandas能夠對數據進行導入、清洗、處理、統計和輸出。
1、數據結構:Series和DataFrame
一、Series(序列——一維序列結構)
(1)概念:Series是個定長的字典序列。存儲時至關於兩個ndarray,這是與字典結構最大的不一樣,由於字典結構裏,元素個數是不固定的。
(2)屬性:index 與 value
index默認是從0開始的整數序列,固然也能夠本身指定索引。
Series看起來像一種特殊的字典結構,所以咱們也能夠採用字典方式來建立Series。
Series元素的類型能夠不一致,就像NumPy的數組,元素類型能夠不一樣。
from pandas import Series x1 = Series([100, 200, 300, 400]) x1 Out[3]: 0 100 1 200 2 300 3 400 dtype: int64 x2 = Series(data=[100, 200, 300, 400], index=['a', 'b', 'c', 'd']) x2 Out[5]: a 100 b 200 c 300 d 400 dtype: int64 x1[2], x2['c'] Out[6]: (300, 300) x3 = Series({'a': 100, 'b': 200, 'c': 300, 'd': 400}) x3 Out[8]: a 100 b 200 c 300 d 400 dtype: int64 x2 == x3 Out[9]: a True b True c True d True dtype: bool x4 = Series([1, 'Mike', 'male', 20]) x4 Out[11]: 0 1 1 Mike 2 male 3 20 dtype: object import numpy as np x5 = np.array([1, 'Mike', 'male', 20]) x5 Out[14]: array(['1', 'Mike', 'male', '20'], dtype='<U11') x5[1] Out[15]: 'Mike' print(x5) ['1' 'Mike' 'male' '20'] print(x5) ['1' 'Mike' 'male' '20']
二、DataFrame(數據幀——二維表結構)
DataFrame包括行索引和列索引,能夠將其當作是由相同索引的Series組成的字典類型。
行索引是默認的0、一、二、三、4,列索引是用戶自定義的。固然行索引也能夠自定義。
from pandas import DataFrame data = {'Chinese': [89, 67, 89, 65, 84], 'Math': [78, 90, 63, 75, 80], 'English': [90, 67, 87, 60, 87]} df1 = DataFrame(data) df1 Out[4]: Chinese Math English 0 89 78 90 1 67 90 67 2 89 63 87 3 65 75 60 4 84 80 87 df2 = DataFrame(data, index=['Mike', 'Alice', 'Frank', 'Brown', 'Smith']) df2 Out[6]: Chinese Math English Mike 89 78 90 Alice 67 90 67 Frank 89 63 87 Brown 65 75 60 Smith 84 80 87
能夠經過行索引取某一行的數據:
經過行索引與列索引獲取某個元素值:
瞭解了Series與DataFrame這兩個數據結構後,咱們就能夠從數據處理的流程角度來看它們的使用方法。
2、數據導入和輸出
一、導入excel文件
二、導入csv文件
三、將數據幀導出成excel文件
固然,還能夠將數據幀導出成各類格式的文件,好比csv、html、json等等。
3、數據清洗
一、刪除數據幀中沒必要要的行或列
刪除Brown所在行:
繼續刪掉Chinese那一列:
二、重命名列名
函數:rename(columns=new_names, inplace=True)
- 參數inplace設置True,直接在原數據幀上修改列名;
- 參數inplace設置爲False,原數據幀列名不變,在返回的數據幀上修改列名。
將列名Math改成ShuXue,English改成YingYu:
能夠看到,若是參數inplace設置爲True,那麼直接在原數據幀上修改列名。
若是參數inplace不設置,默認是False,那麼原數據幀列名不變,返回的數據幀列名獲得修改。
df2的列名仍是ShuXue和YingYu,只有返回的數據幀df3列名改爲了Math和English。
三、去掉重複的行
數據採集中可能存在重複的行,使用drop_duplicates()就能自動去掉重複的行。
注意,調用這個去重方法,不改變原數據幀,只是在返回的數據幀裏去掉重複的行。
四、格式問題
(1)更改數據格式(類型)
使用astype函數來規範數據格式,好比將數據幀df2的ShuXue字段值改爲str類型:
將df2的YingYu字段類型改爲float64:
此時,再查看數據幀df2的內容:
有點奇怪,YingYu字段的值仍是整型,沒有變成浮點型。
import numpy as np import pandas as pd from pandas import DataFrame data = {'Chinese': [89, 67, 89, 65, 84], 'Math': [78, 90, 63, 75, 80], 'English': [90, 67, 87, 60, 87]} df1 = DataFrame(data) df1 Out[6]: Chinese Math English 0 89 78 90 1 67 90 67 2 89 63 87 3 65 75 60 4 84 80 87 df2 = DataFrame(data, index=['Mike', 'Alice', 'Frank', 'Brown', 'Smith']) df2 Out[8]: Chinese Math English Mike 89 78 90 Alice 67 90 67 Frank 89 63 87 Brown 65 75 60 Smith 84 80 87 df2 = df2.drop(columns=['Chinese']) df2 Out[10]: Math English Mike 78 90 Alice 90 67 Frank 63 87 Brown 75 60 Smith 80 87 df2 = df2.drop(index='Brown') df2 Out[12]: Math English Mike 78 90 Alice 90 67 Frank 63 87 Smith 80 87 df2.rename(columns={'Math': 'ShuXue', 'English': 'YingYu'}, inplace=True) df2 Out[14]: ShuXue YingYu Mike 78 90 Alice 90 67 Frank 63 87 Smith 80 87 col1 = df2['ShuXue'].astype(np.string_) col2 = df2['YingYu'].astype(np.float64) DataFrame(col1) Out[17]: ShuXue Mike b'78' Alice b'90' Frank b'63' Smith b'80' DataFrame(col2) Out[18]: YingYu Mike 90.0 Alice 67.0 Frank 87.0 Smith 87.0 # 將col1與col2橫向拼接 pd.concat([col1, col2], axis=1) Out[20]: ShuXue YingYu Mike b'78' 90.0 Alice b'90' 67.0 Frank b'63' 87.0 Smith b'80' 87.0
(2)大小寫轉換
有三個函數upper()、lower()、title()。
(3)數據間的空格
有時先將數據轉換成str類型,是爲了方便對數據進行操做,好比要刪除數據間的空格,就可使用strip函數。
也能夠用strip函數來刪除特定的字符:
五、查找空值
數據源可能存在有些字段是NaN的狀況,如何查找空值呢?能夠利用pandas的isnull函數來查找。
若是想知道哪一列存在空值,能夠利用df.isnull().any()函數:
六、使用apply函數對數據進行清洗
apply函數是Pandas中自由度很是高的函數,使用頻率也十分高。
(1)應用系統自帶函數
(2)應用自定義函數
定義一個提分20%的函數:
將這個提分函數應用到Chinese科目上:
定義一個函數,添加一個新字段Score,計算三科成績的加權平均值:
七、添加行和添加列
(1)添加新行:Green 89 89 85
(2)在Alice以後插入新行:Brian 56 63 90
(3)添加新列:Average
4、數據統計
在數據清洗後,咱們就要對數據進行統計了。Pandas和NumPy同樣,都有經常使用的統計函數,若是遇到空值NaN,會自動排除。
一、count()函數
二、describe()函數
該函數是個統計大禮包,對數據有個全面的瞭解。
三、方差函數var()
四、中位數函數median()
5、數據表合併
兩個數據表DataFrame合併要使用merge()函數,有下列5種形式:
一、基於指定列進行鏈接
二、inner內鏈接
inner內鏈接是merge函數的默認狀況,基於公共鍵進行鏈接,由於df1與df2的公共鍵是name,其實就是基於name的鏈接:
三、left鏈接
left鏈接是以第一個DataFrame爲主,第二個DataFrame爲輔的鏈接。
四、right鏈接
right鏈接是以第二個DataFrame爲主,第一個DataFrame爲輔的鏈接。
五、outer外鏈接
外鏈接至關於兩個DataFrame求並集。
如何查詢成績在90分以上的記錄?
如何查詢成績在80分與90分之間的記錄?
6、如何用SQL方式打開Pandas
Pandas的DataFrame數據類型可讓咱們像處理數據表同樣進行操做,好比數據表的增刪改查,均可以用Pandas工具來完成。不過也有不少人記不住這些Pandas命令,而但願採用本身更加熟練的SQL語句來對數據表進行操做。
利用pandasql工具能夠採用SQL語句操做數據表。pandasql主要的函數sqldf,接收兩個參數:SQL查詢語句和一組環境變量globals()或locals()。這樣咱們就能夠在Python裏直接用SQL語句操做DataFrame了。
一、安裝pandasql工具包
二、查詢案例演示
(1)查詢姓名爲Howard的記錄
(2)查詢語文成績在80與90之間的記錄
在定義pysqldf時候採用了lamda函數,也就是匿名函數,對於sql語句進行處理。
不用pandasql,也能夠直接利用pandas語句完成一樣的查詢任務:
(3)將Howard的語文成績改爲99
(4)刪除姓名爲Howard的記錄
7、總結
和NumPy同樣,Pandas有兩個很是重要的數據結構:Series和DataFrame。
使用Pandas能夠直接從csv或xslx等文件導入數據,以及最終輸出到不一樣類型的文件中,好比csv或excel文件。
重點學習了數據清洗的操做,以及Pandas提供的統計函數,尤爲你們要記住的是統計大禮包函數describe()。
學習瞭如何利用merge函數將兩個數據表合併,並學習了5種不一樣的鏈接方式。
學習了利用pandasql工具在Pandas裏採用sql語句對數據表進行操做。
Pandas包與NumPy庫配合使用能夠發揮巨大的威力,正是有了Pandas(潘大師)工具,Python作數據挖掘纔有優點。
8、課後練習
利用下表建立DataFrame,進行數據清洗。同時新增一列「總和」計算每一個人三科成績之和。
# 數據清洗 import pandas as pd from pandas import DataFrame df = pd.read_excel('e:/excelfiles/test2.xlsx') print("原表:") print(df) # 1. 刪除有NaN值的行 cols = [] nullcols = df.isnull().any() for i in range(len(nullcols)): if nullcols[i] == True: cols.append(nullcols.index[i]) nulltable = df.isnull() for i in range(len(cols)): nullindex = nulltable[nulltable[cols[i]] == True].index[0] df = df.drop(index = nullindex) print("刪除有NaN的行:") print(df) # 2. 刪除重複的行 df = df.drop_duplicates() print("刪除重複的行:") print(df) # 3. 添加總分字段,計算總分 df['總分'] = (df['語文'] + df['英語'] + df['數學']) / 3 print("添加總分字段:") print(df)
運行結果:
原表: 姓名 語文 英語 數學 0 張飛 66.0 65.0 NaN 1 關羽 95.0 85.0 98.0 2 趙雲 95.0 92.0 96.0 3 黃忠 90.0 88.0 77.0 4 典韋 80.0 90.0 90.0 5 典韋 80.0 90.0 90.0 6 馬超 NaN 89.0 74.0 7 曹洪 89.0 78.0 96.0 8 張郃 80.0 67.0 86.0 9 徐晃 85.0 NaN 56.0 刪除有NaN的行: 姓名 語文 英語 數學 1 關羽 95.0 85.0 98.0 2 趙雲 95.0 92.0 96.0 3 黃忠 90.0 88.0 77.0 4 典韋 80.0 90.0 90.0 5 典韋 80.0 90.0 90.0 7 曹洪 89.0 78.0 96.0 8 張郃 80.0 67.0 86.0 刪除重複的行: 姓名 語文 英語 數學 1 關羽 95.0 85.0 98.0 2 趙雲 95.0 92.0 96.0 3 黃忠 90.0 88.0 77.0 4 典韋 80.0 90.0 90.0 7 曹洪 89.0 78.0 96.0 8 張郃 80.0 67.0 86.0 添加總分字段: 姓名 語文 英語 數學 總分 1 關羽 95.0 85.0 98.0 92.666667 2 趙雲 95.0 92.0 96.0 94.333333 3 黃忠 90.0 88.0 77.0 85.000000 4 典韋 80.0 90.0 90.0 86.666667 7 曹洪 89.0 78.0 96.0 87.666667 8 張郃 80.0 67.0 86.0 77.666667
刪除有NaN的行,算法能夠簡化一點:
刪除有NaN的行,顯得太簡單粗暴,能夠採用比較溫和的均值填充法。
運行結果以下:
原表: 姓名 語文 英語 數學 0 張飛 66.0 65.0 NaN 1 關羽 95.0 85.0 98.0 2 趙雲 95.0 92.0 96.0 3 黃忠 90.0 88.0 77.0 4 典韋 80.0 90.0 90.0 5 典韋 80.0 90.0 90.0 6 馬超 NaN 89.0 74.0 7 曹洪 89.0 78.0 96.0 8 張郃 80.0 67.0 86.0 9 徐晃 85.0 NaN 56.0 用列均值填充NaN值: 姓名 語文 英語 數學 0 張飛 66.0 65.0 84.8 1 關羽 95.0 85.0 98.0 2 趙雲 95.0 92.0 96.0 3 黃忠 90.0 88.0 77.0 4 典韋 80.0 90.0 90.0 5 典韋 80.0 90.0 90.0 6 馬超 84.4 89.0 74.0 7 曹洪 89.0 78.0 96.0 8 張郃 80.0 67.0 86.0 9 徐晃 85.0 82.7 56.0 刪除重複的行: 姓名 語文 英語 數學 0 張飛 66.0 65.0 84.8 1 關羽 95.0 85.0 98.0 2 趙雲 95.0 92.0 96.0 3 黃忠 90.0 88.0 77.0 4 典韋 80.0 90.0 90.0 6 馬超 84.4 89.0 74.0 7 曹洪 89.0 78.0 96.0 8 張郃 80.0 67.0 86.0 9 徐晃 85.0 82.7 56.0 添加總分字段: 姓名 語文 英語 數學 總分 0 張飛 66.0 65.0 84.8 71.933333 1 關羽 95.0 85.0 98.0 92.666667 2 趙雲 95.0 92.0 96.0 94.333333 3 黃忠 90.0 88.0 77.0 85.000000 4 典韋 80.0 90.0 90.0 86.666667 6 馬超 84.4 89.0 74.0 82.466667 7 曹洪 89.0 78.0 96.0 87.666667 8 張郃 80.0 67.0 86.0 77.666667 9 徐晃 85.0 82.7 56.0 74.566667
本文分享 CSDN - howard2005。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。