Python數據分析學習筆記04:Pandas基礎

文章目錄html

1、數據結構:Series和DataFramepython

一、Series(序列——一維序列結構)算法

二、DataFrame(數據幀——二維表結構)sql

2、數據導入和輸出json

一、導入excel文件數組

二、導入csv文件數據結構

三、將數據幀導出成excel文件app

3、數據清洗函數

一、刪除數據幀中沒必要要的行或列工具

二、重命名列名

三、去掉重複的行

四、格式問題

(1)更改數據格式(類型)

(2)大小寫轉換

(3)數據間的空格

五、查找空值

六、使用apply函數對數據進行清洗

(1)應用系統自帶函數

(2)應用自定義函數

七、添加行和添加列

(1)添加新行:Green   89     89    85

(2)在Alice以後插入新行:Brian    56   63   90

(3)添加新列:Average

4、數據統計

一、count()函數

二、describe()函數

三、方差函數var()

四、中位數函數median()

5、數據表合併

一、基於指定列進行鏈接

二、inner內鏈接

三、left鏈接

四、right鏈接

五、outer外鏈接

6、如何用SQL方式打開Pandas

一、安裝pandasql工具包

二、查詢案例演示

(1)查詢姓名爲Howard的記錄

(2)查詢語文成績在80與90之間的記錄

(3)將Howard的語文成績改爲99

(4)刪除姓名爲Howard的記錄

7、總結

8、課後練習


在數據分析工做中,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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索