Python常用包學習(二)Pandas包(理論+動手實踐)

Python常用包學習(二)Pandas包(理論+動手實踐)

pandas是一種Python數據分析的利器,是一個開源的數據分析包,最初是應用於金融數據分析工具而開發出來的,因此pandas爲時間序列分析提供了很好的支持。pandas是PyData項目的一部分。

  • 官網:http://pandas.pydata.org/
  • 官方文檔:http://pandas.pydata.org/pandas-docs/stable/

 

pandas引入約定

 

pandas基本數據結構

pandas中主要有兩種數據結構,分別是:Series和DataFrame。

Series

  •  Series:一種類似於一維數組的對象,是由一組數據(各種NumPy數據類型)以及一組與之相關的數據標籤(即索引)組成。僅由一組數據也可產生簡單的Series對象。注意:Series中的索引值是可以重複的。

Series創建

通過一維數組創建

通過字典的方式創建

 

Series值的獲取

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

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

Series的運算

NumPy中的數組運算,在Series中都保留了,均可以使用,並且Series進行數組運算的時候,索引與值之間的映射關係不會發生改變。

 注意:其實在操作Series的時候,基本上可以把Series看成NumPy中的ndarray數組來進行操作。ndarray數組的絕大多數操作都可以應用到Series上。(ndarray相關操作可參考我的第一篇博客)

https://blog.csdn.net/LuYi_WeiLin/article/details/99981444

 

                  

 

Series缺失值檢測

pandas中的isnullnotnull兩個函數可以用於在Series中檢測缺失值,這兩個函數的返回時一個布爾類型的Series

 

Series自動對齊

當多個series對象之間進行運算的時候,如果不同series之間具有不同的索引值,那麼運算會自動對齊不同索引值的數據,如果某個series沒有某個索引值,那麼最終結果會賦值爲NaN

 

Series及其索引的name屬性

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

 

 

DataFrame

  •  DataFrame:一個表格型的數據結構,包含有一組有序的列,每列可以是不同的值類型(數值、字符串、布爾型等),DataFrame即有行索引也有列索引,可以被看做是由Series組成的字典。

DataFrame的創建

通過二維數組創建

通過字典的方式創建

索引對象

  • 不管是Series還是DataFrame對象,都有索引對象。
  •  索引對象負責管理軸標籤和其它元數據(eg:軸名稱等等)
  •  通過索引可以從Series、DataFrame中獲取值或者對某個索引值進行重新賦值
  •  Series或者DataFrame的自動對齊功能是通過索引實現的

 

DataFrame數據獲取

  • 可以直接通過列索引獲取指定列的數據, eg: df[column_name]
  •  如果需要獲取指定行的數據的話,需要通過ix方法來獲取對應行索引的行數據,eg: df.ix[index_name]

 

與Numpy花式索引裏面有相同之處

 

pandas基本功能

數據文件讀取/文本數據讀取

通過pandas提供的read_xxx相關的函數可以讀取文件中的數據,並形成DataFrame,常用的數據讀取方法爲:read_csv,主要可以讀取文本類型的數據

  • 讀取txt文件

  • 讀取csv文件

  • 讀取excel文件

 

 索引、選取和數據過濾

通過DataFrame的相關方式可以獲取對應的列或者數據形成一個新的DataFrame, 方便後續進行統計計算。

數據過濾獲取

 

缺省值NaN處理方法

對於DataFrame/Series中的NaN一般採取的方式爲刪除對應的列/行或者填充一個默認值

方法

說明

dropna

根據標籤的值中是否存在缺失數據對軸標籤進行過濾(刪除), 可以通過閾值的調節對缺失值的容忍度

fillna

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

isnull

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

notnull

isnull的否定式

import numpy as np
df4=DataFrame(np.floor(np.random.randn(5,3)*100))
print(df4)
print()
df4[0]=np.nan   #修改一列
df4.loc[1,1]=np.nan #修某一位置的改值
df4.loc[3]=np.nan  #修改某一行
df4.columns=['語文','數學','英語']   #列索引
df4.index=['tom','jerry','ecel','exo','ppd']   #行索引
df4.loc['ppd','語文']=100
print(df4)
print()
print(df4.isnull())
print()
print(df4.notnull())
print()
df3=df4.dropna()#一行中只要有一個nan都刪除
print(df3)
df5=df4.dropna(how="all")  #整行都爲nan則刪除
print(df5)
print()
df6=df4.dropna(axis=1)   #丟棄列中含nan的列
print(df6)

填失缺失值

df=DataFrame(np.ceil(np.random.randn(7,3)*1000))
print(df)
df.loc[:4,1]=np.nan
df.loc[:2,2]=np.nan
print(df)
print()
print(df.fillna(0))
print()
print(df.fillna({1:0.5,2:-1,3:1}))
print()
#method = 'ffill'/'pad':用前一個非缺失值去填充該缺失值
df.loc[0,:]=1
print(df.fillna(method='ffill'))
print()
#method = 'bflii'/'backfill':用下一個非缺失值填充該缺失值
print(df)
print()
print(df.fillna(method='bfill'))
print()
#指定limit參數
print(df.fillna(method='bfill',limit=2))
print()
#制定axis參數
print(df.fillna(method='ffill',limit=1,axis=1))

 

 函數的應用和映射

方法

說明

count

計算非NA值的數量

describe

針對Series或各DataFrame列計算總統計值

min/max

計算最大值、最小值

argminargmax

計算能夠獲取到最小值和最大值的索引位置(整數)

idxminidxmaxe'zui'da'zhi

計算能夠獲取到最小值和最大值的索引值

quantile

計算樣本的分位數(01)

sum

值的總和

mean

值的平均數

median

值的中位數

方法

說明

mad

根據平均值計算平均絕對距離差

var

樣本數值的方差

std

樣本值的標準差

cumsum

樣本值的累計和

cummincummax

樣本的累計最小值、最大值

cumprod

樣本值的累計積

pct_change

計算百分數變化

import numpy as np
df4=DataFrame(np.floor(np.fabs(np.random.randn(5,3))*100))
df4.loc[1,1]=np.nan #修某一位置的改值
df4.columns=['語文','數學','英語']   #列索引
df4.index=['tom','jerry','ecel','exo','ppd']   #行索引
df4.fillna(0,inplace=True)   #不創建副本直接修改原對象
print("\n=========Dataframe==========\n",df4)
print("\n=========df4.describe==========\n",df4.describe())
print("\n=========df4.count==========\n",df4.count())
print("\n=========df4.count(axis=1)==========\n",df4.count(axis=1))
print("\n=========df4.max==========\n",df4.max())
print("\n=========df4.quantile==========\n",df4.quantile(0.25))  #25%的值在哪裏
print("\n=========df4.sum==========\n",df4.sum())  #25%的值在哪裏
print("\n=========df4.sum(axis=1)==========\n",df4.sum(axis=1))  #25%的值在哪裏
print("\n=========df4.mean(axis=1)==========\n",np.ceil(df4.mean(axis=1)))  
print("\n=========df4.mad(axis=1)==========\n",np.ceil(df4.mad(axis=1))) #根據平均值計算平均絕對距離差
print("\n=========df4.var(axis=1)==========\n",np.ceil(df4.var(axis=1))) 
print("\n=========df4.std(axis=1)==========\n",np.ceil(df4.std(axis=1))) 
print("\n=========df4.cumsum(axis=1)==========\n",np.ceil(df4.cumsum(axis=1)))  #樣本值的累計和
print("\n=========df4.cummin(axis=1)==========\n",np.ceil(df4.cummin(axis=1)))  #樣本值的累計最小值
print("\n=========df4.cumprod(axis=1)==========\n",np.ceil(df4.cumprod(axis=1)))  #樣本值的累計積
print("\n=========df4.pct_change==========\n",df4.pct_change())  #計算百分比變化
​

=========Dataframe==========
           語文    數學     英語
tom     37.0  19.0  138.0
jerry   59.0   0.0   17.0
ecel    80.0   9.0  100.0
exo    151.0  60.0   28.0
ppd     35.0  24.0   21.0

=========df4.describe==========
                語文         數學          英語
count    5.000000   5.000000    5.000000
mean    72.400000  22.400000   60.800000
std     47.610923  22.963014   54.942697
min     35.000000   0.000000   17.000000
25%     37.000000   9.000000   21.000000
50%     59.000000  19.000000   28.000000
75%     80.000000  24.000000  100.000000
max    151.000000  60.000000  138.000000

=========df4.count==========
 語文    5
數學    5
英語    5
dtype: int64

=========df4.count(axis=1)==========
 tom      3
jerry    3
ecel     3
exo      3
ppd      3
dtype: int64

=========df4.max==========
 語文    151.0
數學     60.0
英語    138.0
dtype: float64

=========df4.quantile==========
 語文    37.0
數學     9.0
英語    21.0
Name: 0.25, dtype: float64

=========df4.sum==========
 語文    362.0
數學    112.0
英語    304.0
dtype: float64

=========df4.sum(axis=1)==========
 tom      194.0
jerry     76.0
ecel     189.0
exo      239.0
ppd       80.0
dtype: float64

=========df4.mean(axis=1)==========
 tom      65.0
jerry    26.0
ecel     63.0
exo      80.0
ppd      27.0
dtype: float64

=========df4.mad(axis=1)==========
 tom      49.0
jerry    23.0
ecel     36.0
exo      48.0
ppd       6.0
dtype: float64

=========df4.var(axis=1)==========
 tom      4115.0
jerry     923.0
ecel     2287.0
exo      4073.0
ppd        55.0
dtype: float64

=========df4.std(axis=1)==========
 tom      65.0
jerry    31.0
ecel     48.0
exo      64.0
ppd       8.0
dtype: float64

=========df4.cumsum(axis=1)==========
           語文     數學     英語
tom     37.0   56.0  194.0
jerry   59.0   59.0   76.0
ecel    80.0   89.0  189.0
exo    151.0  211.0  239.0
ppd     35.0   59.0   80.0

=========df4.cummin(axis=1)==========
           語文    數學    英語
tom     37.0  19.0  19.0
jerry   59.0   0.0   0.0
ecel    80.0   9.0   9.0
exo    151.0  60.0  28.0
ppd     35.0  24.0  21.0

=========df4.cumprod(axis=1)==========
           語文      數學        英語
tom     37.0   703.0   97014.0
jerry   59.0     0.0       0.0
ecel    80.0   720.0   72000.0
exo    151.0  9060.0  253680.0
ppd     35.0   840.0   17640.0

=========df4.pct_change==========
              語文        數學        英語
tom         NaN       NaN       NaN
jerry  0.594595 -1.000000 -0.876812
ecel   0.355932       inf  4.882353
exo    0.887500  5.666667 -0.720000
ppd   -0.768212 -0.600000 -0.250000

相關係數與協方差

df=DataFrame({
    "GDP":[12,45,36,89],
    "air_temperature":[23,52,41,68],
    "year":['2001','2002','2003','2004']
})

print(df)
print("相關係數;\n",df.corr())
print("協方差;\n",df.cov())
print("相關係數;\n",df["GDP"].corr(df['air_temperature']))
print("相關係數;\n",df["GDP"].cov(df['air_temperature']))

唯一值、值計數以及成員資格

  • unique方法用於獲取Series中的唯一值數組(去重數據後的數組)
  •  value_counts方法用於計算一個Series中各值的出現頻率
  •  isin方法用於判斷矢量化集合的成員資格,可用於選取Series中或者DataFrame中列中數據的子集

 

 重置索引

  • 在某一個方向擁有多個(兩個及兩個以上)索引級別
  •  通過層次化索引,pandas能夠以較低維度形式處理高緯度的數據
  •  通過層次化索引,可以按照層次統計數據
  •  層次索引包括Series層次索引和DataFrame層次索引

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章