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中的isnull和notnull兩個函數可以用於在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 |
計算最大值、最小值 |
argmin、argmax |
計算能夠獲取到最小值和最大值的索引位置(整數) |
idxmin、idxmaxe'zui'da'zhi |
計算能夠獲取到最小值和最大值的索引值 |
quantile |
計算樣本的分位數(0到1) |
sum |
值的總和 |
mean |
值的平均數 |
median |
值的中位數 |
方法 |
說明 |
mad |
根據平均值計算平均絕對距離差 |
var |
樣本數值的方差 |
std |
樣本值的標準差 |
cumsum |
樣本值的累計和 |
cummin、cummax |
樣本的累計最小值、最大值 |
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層次索引