程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

第二章 人工智能專題之python進階 - pandas庫

編輯:Python
  • numpy和pandas區別
numpy:處理數值數據
pandas:字符串,時間數據等

1、Pandas概述

  • pandas名稱來源:面板數據(panel data)

Pandas是一個強大的分析結構化數據的工具集,基於Numpy構建,提供了高級數據結構和數據操作工作

 1、基礎是numpy,提供了高效性能矩陣的運算;
2、提供數據清洗功能
3、應用於數據挖掘,數據分析
4、提供了大量能快速便捷地處理數據的函數和方法

2、Pandas數據結構

2.1、Series介紹

Series:是一種一維標記的數據型對象,能夠保存任何數據類型(int,str,float,python object),包含了數據標簽,稱為索引

  • 類似於一維數組的對象1,index=[“名字”,“年齡”,“班級”]
  • 由數據和索引組成
    • 索引在左邊(index),數據在右邊(values)
    • 索引自動創建

2.2、Series創建

(1)通過列表創建

  • 范例
# 1、通過list創建
s1 = pd.Series([1,2,3,4,5])
s1
  • 查詢結果

(2)通過數組創建

  • 范例
# 2、通過數組創建
arr1= np.arange(1,6)
s2 = pd.Series(arr1)
print(s2)
  • 查詢結果

​ (3)通過字典創建

  • 范例
# 3、通過字典創建
dict = {
'name':'李寧','age':18,'class':'三班'}
s3 = pd.Series(dict,index = ['name','age','class','sex'])
s3
  • 查詢結果

3、Series用法

(1)空值判斷

  • 范例
# isnull和not null檢測缺失值
s3.isnull()
  • 查詢結果

(2)獲取數據

獲取數據方式:索引,下標,標簽名
  • 范例
# 1、索引獲取數據
print(s3.index)
print(s3.values)
# 2、下標獲取數據
print(s3[1:3])
# 3、標簽名獲取數據
print(s3['age':'class'])
  • 查詢結果

  • 注意事項
標簽切片和下標切片的區別
標簽切片:包含末端數據
索引切片:不包含末端數據

(3)索引與數據的對應關系

索引和數據的對應關系不被運算結果影響

(4)name屬性

  • 范例
s3.name = "temp" #對象名
s3.index.name = 'values' #對象索引名
s3
  • 查詢結果

3、DateFrame數據結構

3.1、DataFrame概述

DataFrame是一個表格型的數據結構,它含有一組有序的列,每列可以是不同類型的索引值,DataFrame既有行索引也有列索引,它可以被看作是由series組成的字典,數據以二維結構存放

  • 類似多維數組/表格數據(如,excel,R中的DataFrame)
  • 每列數據可以是不同的數據類型
  • 索引包含列索引行索引

3.2、DataFrame創建

  • 范例
# 數組、列表或元組構成的字典構造DataFrame
data = {
'a':[1,2,3,4],
'b':(5,6,7,8),
'c':np.arange(9,13)}
frame = pd.DataFrame(data)
# 相關屬性
print(frame.index)
print(frame.columns)
print(frame.values)
  • 查詢結果

4、索引相關操作

4.1、索引對象概述

1、Series和DataFrame中的索引都是index對象
2、索引對象不可改變,保證數據安全
  • 范例
ps = pd.Series(range(5))
pd = pd.DataFrame(np.arange(9).reshape(3,3),index = ['a','b','c'],columns = ['A','B','C'])
type(ps.index)
  • 運行結果

  • 注意事項
常見索引類型
:1、Index - 索引
:2、Inet64index - 整數索引
:3、MultiIndex - 層級索引
:4、DatetiemIndex - 時間戳索引

4.2、索引基本操作

(1)重新索引

reindex:將索引重新排序,創建一個符合新索引的新對象
  • 范例
s = pd.Series(np.random.randn(5),index=['a','b','c','d','e'])
print(s)
s.reindex(['e','b','f','d'])
  • 運行結果

(2)增

1、在原有數據結構上增加數據
2、在新建數據結構上增加數據
  • 范例 - series增加數據
s = pd.Series(np.random.randn(5),index=['a','b','c','d','e'])
s['f'] = 100
print(s)
  • 查詢結果

  • 范例 - DF增加列
import numpy as np
import pandas as pd
df = pd.DataFrame(np.arange(1,10).reshape(3,3),index=['a','b','c'],columns = ['A1','B1','C1'])
print(df)
print("======")
df['D1'] = np.arange(100,103)
df2 = df
print(df2)
  • 查詢結果

  • 范例 - DF增加行
import numpy as np
import pandas as pd
df = pd.DataFrame(np.arange(1,10).reshape(3,3),index=['a','b','c'],columns = ['A1','B1','C1'])
print(df)
print("======")
df.loc['d'] = np.arange(100,103)
df2 = df
print(df2)
  • 查詢結果

(3)刪

1、del:刪除,會更改原有結構
2、drop:刪除軸上數據,產生新的對象
  • 范例 - Series數據
# 刪除
ps = pd.Series(np.random.randn(5),index=['a','b','c','d','e'])
del ps['e']
print(ps)
ps2 = ps.drop(['a','b'])
print(ps2)
  • 查詢結果

  • 范例 - DF數據
import numpy as np
import pandas as pd
pd = pd.DataFrame(np.random.randn(9).reshape(3,3),columns=['a','b','c'])
print(pd)
# 刪除列
pd1 = pd.drop(['c'],axis=1)
print(pd1)
# 刪除行
pd2 = pd.drop(2)
print(pd2)
  • 查詢結果

(4)改

1、修改列:對象.索引,對象.列
2、修改行:標簽索引loc
  • 范例
import numpy as np
import pandas as pd
pd = pd.DataFrame(np.random.randn(9).reshape(3,3),columns=['a','b','c'])
print(pd)
# 修改列
pd['a'] = 12
pd.b = 22
print(pd)
# 修改行
pd.loc[0] = 100
print(pd)
  • 運行結果

(5)查

1、行索引
2、切片索引:位置切片,標簽切片
3、不連續索引
  • 范例
import numpy as np
import pandas as pd
ps = pd.Series(np.random.randn(5),index=['a','b','c','d','e'])
# 行索引
print(ps['a'])
# 位置切片索引
print(ps[1:3])
# 標簽切片索引,包含終止索引
print(ps['a':'c'])
# 不連續索引
print(ps[['a','c']])
# 布爾索引
print(ps[ps>0])
  • 運行結果

4.3、高級索引

1、loc標簽索引:基於標簽名的索引 pd.loc[2:3,'a']
2、iloc位置索引:基於索引編號索引
3、ix標簽與位置混合索引:知道就行
  • 范例
import numpy as np
import pandas as pd
pd = pd.DataFrame(np.random.randn(9).reshape(3,3),index = [7,8,9],columns=['a','b','c'])
# 標簽索引 - 第一個參數索引行,第二個參數是列
print(pd.loc[7:8,'a'])
# 位置索引 - 兩個參數,行列
print(pd.iloc[0:2,0:2])
  • 查詢結果

5、Pandas運算

5.1、算術運算

  • 注意事項:Pandas進行數據運算時,會按照索引進行一一對應,對應後進行相應的算術運算**,沒有對齊的位置就會用NaN進行填充。**

  • 范例
import numpy as np
import pandas as pd
s1 = pd.Series(np.arange(5),index=['a','b','c','d','e'])
s2 = pd.Series(np.arange(5,10),index=['a','b','c','d','e'])
print(s1)
print(s2)
print(s1+s2)
  • 運行結果

5.3、混合運算

DataFrame和Series混合運算:Series的行索引匹配DataFrame的列索引進行廣播運算,index屬性可沿列運算
  • 范例
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(9).reshape(3,3),index = ['A','B','C'],columns=['A','B','C'])
ds = df.iloc[0]
# 行運算,列廣播
print(df-ds)
# 列運算,行廣播
df.sub(ds,axis = 'index')
  • 運行結果

  • 注意事項
運算規則:索引匹配運算

5.4、函數應用

(1)apply函數

apply:將函數應用到行或列
  • 范例
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(9).reshape(3,3),index = ['A','B','C'],columns=['A','B','C'])
f = lambda x:x.max()
# 應用在行上,進行列運算
print(df.apply(f))
# 應用在列上,進行行運算
print(df.apply(f,axis=1))
  • 運行結果

(2)applymap函數

applymap:將函數應用到每個數據
  • 范例
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(9).reshape(3,3),index = ['A','B','C'],columns=['A','B','C'])
f = lambda x:x**2
print(df.applymap(f))
  • 運行結果

(3)排序

索引排序:sort_index(ascending,axis)
按值排序:sort_values(by,sacending,axis)
  • 范例
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(9).reshape(3,3),index = ['B','D','C'],columns=['A','C','B'])
# 按行索引排序
print(df.sort_index(ascending=False,axis=1))
# 按列值進行排序
print(df.sort_values(by = 'A'))
  • 查詢結果

(4)唯一值和成員屬性

函數名稱描述unique返回一個Series,用於去重value_counts返回Series,包括元素及其個數isin判斷是否存在,返回布爾類型

(5)處理缺失值

  • 范例
import pandas as pd
import numpy as np
df = pd.DataFrame([np.random.randn(3),[1,2,np.nan],[np.nan,4,np.nan]])
# 1、判斷是否存在缺失值
print(df.isnull())
# 2、丟棄缺失數據,默認丟棄行
print(df.dropna())
# 3、填充缺失數據
print(df.fillna(-100))
  • 運行結果

6、層級索引

  • 層級索引**:在輸入索引Index時,輸入了由兩個子list組成的list,第一個子list是外層索引,第二個list是內層索引。**

  • 作用:通過層級索引配合不同等級的一級索引使用,可以將高維數組轉化為Series或DataFrame對向形式

  • 范例

import pandas as pd
import numpy as np
ser_obj = pd.Series(np.random.randn(12),index=[
['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
[0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
])
# 選取子集
''' 根據索引獲取數據。因為現在有兩層索引,當通過外層索引獲取數據的時候,可以直接利用外層索引的標簽來獲取。 當要通過內層索引獲取數據的時候,在list中傳入兩個元素,前者是表示要選取的外層索引,後者表示要選取的內層索引。 '''
print(ser_obj['a',1])
# 交換內外層
print(ser_obj.swaplevel())
  • 運行結果

7、Pandas統計計算

統計計算:默認按列計算
  • 范例
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(32).reshape(8,4))
# 選取
df.sum()
  • 運行結果

  • 常用統計函數
平均數:np.mean()
總和:np.sum()
中位數:np.median()
最大值:np.max()
最小值:np.min()
頻次(計數): np.size()
方差:np.var()
標准差:np.std()
乘積:np.prod()
協方差: np.cov(x, y)
偏度系數(Skewness): skew(x)
峰度系數(Kurtosis): kurt(x)
正態性檢驗結果: normaltest(np.array(x))
四分位數:np.quantile(q=[0.25, 0.5, 0.75], interpolation=“linear”)
四分位數:describe() – 顯示25%, 50%, 75%位置上的數據
相關系數矩陣(Spearman/ Person/ Kendall)相關系數: x.corr(method=“person”))

8、數據讀取與存儲

8.1、讀寫文本格式文件

  • 讀取csv文件read_csv(file_path or buf,usecols,encoding):file_path:文件路徑,usecols:指定讀取的列名,encoding:編碼

  • 范例

data = pd.read_csv('D:/jupyter_notebook/bfms_w2_out.csv',encoding='utf8')
data.head()
  • 運行結果

9、數據連接/合並

9.1、數據連接

pd.merge:(left, right, how='inner',on=None,left\_on=None, right\_on=None \)
left:合並時左邊的DataFrame
right:合並時右邊的DataFrame
how:合並的方式,默認'inner', 'outer', 'left', 'right'
on:需要合並的列名,必須兩邊都有的列名,並以 left 和 right 中的列名的交集作為連接鍵
left\_on: left Dataframe中用作連接鍵的列
right\_on: right Dataframe中用作連接鍵的列
* 內連接 inner:對兩張表都有的鍵的交集進行聯合
  • 范例
import pandas as pd
import numpy as np
left = pd.DataFrame({
'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({
'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
pd.merge(left,right,on='key') #指定連接鍵key
  • 運行結果

9.2、數據合並

concat:可指定軸進行橫向或者縱向合並
  • 范例
df1 = pd.DataFrame(np.arange(6).reshape(3,2),index=list('abc'),columns=['one','two'])
df2 = pd.DataFrame(np.arange(4).reshape(2,2)+5,index=list('ac'),columns=['three','four'])
print(df1)
print(df2)
pd.concat([df1,df2],axis='columns') #指定axis=1連接
  • 運行結果

9.3、數據重塑

stack:stack函數會將數據從”表格結構“變成”花括號結構“,即將其行索引變成列索引
unstack:unstack函數將數據從”花括號結構“變成”表格結構“,即要將其中一層的列索引變成行索引。

  • 范例
import numpy as np
import pandas as pd
df_obj = pd.DataFrame(np.random.randint(0,10, (5,2)), columns=['data1', 'data2'])
print(df_obj)
print("stack")
stacked = df_obj.stack()
print(stacked)
print("unstack")
# 默認操作內層索引
print(stacked.unstack())
# 通過level指定操作索引的級別
print(stacked.unstack(level=0))
  • 運行結果


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved