Pandas 概述
Pandas(Python Data Analysis Library)是基於NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。Pandas 納入了大量庫和一些標准的數據模型,提供了高效地操作大型數據集所需的工具。Pandas提供了大量能使我們快速便捷地處理數據的函數和方法。它是使Python成為強大而高效的數據分析環境的重要因素之一。
Pandas專用於數據預處理和數據分析的Python第三方庫,最適合處理大型結構化表格數據
- Pandas是2008年Wes McKinney於AQR資本做量化分析師時創建
- Pandas借鑒了R的數據結構
- Pandas基於Numpy搭建,支持Numpy中定義的大部分計算
- Pandas含有使數據分析工作更簡單高效的高級數據結構和操作工具
- Pandas底層用Cython和C做了速度優化,極大提高了執行效率
Pandas 常用的數據結構有兩種:Series 和 DataFrame
Pandas引入約定
from pandas import Series, DataFrame import pandas as pd
Python、Numpy和Pandas對比
Python
- list:Python自帶數據類型,主要用一維,功能簡單,效率低
- Dict:Python自帶數據類型,多維鍵值對,效率低
Numpy
- ndarray:Numpy基礎數據類型,單一數據類型
- 關注數據結構/運算/維度(數據間關系)
Pandas
- Series:1維,類似帶索引的1維ndarray
- DataFrame:2維,表格型數據類型,類似帶行/列索引的2維ndarray 關注數據與索引的關系(數據實際應用)
從實用性、功能強弱和和可操作性比較:list < ndarray < Series/DataFrame
數據規整和分析工作中,ndarry數組作為必要補充,大部分數據盡量使用Pandas數據類型
Pandas數據結構
Pandas的核心為兩大數據結構,數據分析相關所有事物都是圍繞着這兩種結構進行的
- Series:用於存儲一個序列的一維數據
- DataFrame:DataFrame作為更復雜的數據結構,則用於存儲多維數據
雖然這些數據結構不能解決所有的問題,但它們為大多數應用提供了有效和強大的工具。就簡潔性
而言,他們理解和使用起來都很簡單。
Series 簡介
Series 是一個帶有 名稱 和 索引 的 一維數組,在 Series 中包含的數據類型可以是整數、浮點、字符串、Python對象等。
基礎屬性:
- values:返回元素
- index:返回索引
- columns:返回列名
- dtypes:返回類型
- size:返回元素個數
- ndim:返回維度數
- shape:返回數據形狀(行列數目)
Series 創建
1. 簡單構建一個含索引和年齡的用戶信息
import pandas as pd user_info = pd.Series(data=[24, 45, 33, 62]) user_info # 結果如下
0 24 1 45 2 33 3 62 dtype: int64
2. 將索引自定義為名字,即將年齡與用戶聯系起來
# 構建索引 # name="user_index":為索引起一個名字 user_index=pd.Index(['Tom','Scott','Jass','Jame'],name="user_index") # 構建Series # name="user_info":為 Series 起個名字 user_info = pd.Series(data=[24, 45, 33, 62],index=user_index,name="user_info",dtype=float) # 結果如下 user_index Tom 24.0 Scott 45.0 Jass 33.0 Jame 62.0 Name: user_info, dtype: float64
Series 訪問
Series 包含了 dict 的特點,也就意味着可以使用與 dict 類似的一些操作。我們可以將 index 中的元素看成是 dict 中的 key
# 查看所有的值列表 user_info.values # 查看所有的索引列表 user_info.index # 獲取Tom的年齡 user_info['Tom'] # 24.0 # 可以通過 get 方法來獲取。通過這種方式的好處是當索引不存在時,不會拋出異常。 user_info['Scott'] # 45.0
Series 除了像 dict 外,也非常像 ndarray,這也就意味着可以采用切片操作
# 獲取第一個元素 user_info[0] # 24.0 # 獲取前三個元素(左閉右開) user_info[:3] """ user_index Tom 24.0 Scott 45.0 Jass 33.0 Name: user_info, dtype: float64 """ # 獲取年齡大於50的元素 user_info[user_info>50] """ user_index Jame 62.0 Name: user_info, dtype: float64 """ # 獲取第4個和第二個元素 user_info[[3, 1]] """ user_index Jame 62.0 Scott 45.0 Name: user_info, dtype: float64 """ # 查看去重后的元素 user_info.unique() # 計算不同元素出現的次數 user_info.value_counts() # 判斷元素所屬關系 s.isin([24,32]) # 將元素中的值取出判斷是否出現在指定數組中 s[s.isin([24,32])]
Series 的向量化操作
Series 與 ndarray 一樣,也是支持向量化操作的。同時也可以傳遞給大多數期望 ndarray 的NumPy 方法。
# 將所有人的年齡加1 user_info + 1 """ user_index Tom 25.0 Scott 46.0 Jass 34.0 Jame 63.0 Name: user_info, dtype: float64 """
DataFrame 簡介
DataFrame 是一個帶有索引的二維數據結構,每列可以有自己的名字,並且可以有不同的數據類型。你可以把它想象成一個 excel 表格或者數據庫中的一張表,DataFrame 是最常用的 Pandas 對象。
基礎屬性:
- values:返回元素
- index:返回索引
- columns:返回列名
- dtypes:返回類型
- size:返回元素個數
- ndim:返回維度數
- shape:返回數據形狀(行列數目)
DataFrame 創建
構建方式一:構建一個dict,將dict傳遞給data參數
data={ "age":[12,23,45,37], "city":["chongqing","nanjing","wuhan","shenyang"] } index = pd.Index(['Tom','Scott','Jass','Jame'],name="user_name") pd.DataFrame(data=data,index=index)
由上表我們可以看到,DataFrame已經成功構建,且索引是用戶姓名,另外兩列信息分別為用戶年齡和城市信息
構建方式二:先構建一個二維數組,然后再生成一個列名稱列表。
data=[[12,"shenyang"], [23,"chongqing"], [45,"wuhan"], [37,"nanjing"] ] index = pd.Index(['Tom','Scott','Jass','Jame'],name="user_index") # 標簽 column = ["age","city"] user_info = pd.DataFrame(data=data,index=index,columns=column) user_info
DataFrame 訪問
訪問行 --> 通過索引名 --> loc方法
# 通過索引訪問某個人的數據 user_info.loc[['Tom']] # 通過索引訪問指定人的數據 user_info.loc[['Tom','Jass']]
訪問行 --> 通過行所在位置 --> iloc方法
# 訪問第一個人的信息 user_info.iloc[0] # 訪問前3個人的信息 user_info.iloc[0:3]
訪問列 --> 通過屬性(.列名)
user_info.age """ user_index Tom 12 Scott 23 Jass 45 Jame 37 Name: age, dtype: int64 """
訪問列 --> 通過[column]
# 獲取一列數據 user_info[["age"]] # 獲取多列數據 user_info[["age","city"]] """ age city user_index Tom 12 shenyang Scott 23 chongqing Jass 45 wuhan Jame 37 nanjing """
新增列
通過傳入一個標量,Pandas 會自動幫我們廣播來填充所有的位置
# 添加的信息一致 user_info["sex"]="male" user_info """ age city sex user_index Tom 12 shenyang male Scott 23 chongqing male Jass 45 wuhan male Jame 37 nanjing male """ # 添加的指定信息 user_info["sex"]=["male","female","male","male"] user_info """ age city sex user_index Tom 12 shenyang male Scott 23 chongqing female Jass 45 wuhan male Jame 37 nanjing male """ # 在原有信息上新增一列與原有信息相關數據 user_info.assign(age_add_one = user_info["age"] + 1) """ age city sex age_add_one user_index Tom 12 shenyang male 13 Scott 23 chongqing female 24 Jass 45 wuhan male 46 Jame 37 nanjing male 38 """ import numpy as np user_info.assign(sex_code = np.where(user_info["sex"] == "male", 1, 0)) """ age city sex sex_code user_index Tom 12 shenyang male 1 Scott 23 chongqing female 0 Jass 45 wuhan male 1 Jame 37 nanjing male 1 """
刪除列
drop(labels, axis=0, level=None, inplace=False, errors='raise')
參數解釋:
- lables:接收string或array。代表刪除的行或列的標簽。無默認
- axis:接收0或1。代表操作的軸向。默認為0
- levels:接收int或者索引名。代表標簽所在級別。默認為None
- inplace:接收boolean。代表操作是否對原數據生效。默認為False
# 刪除某一列 user_info.drop(["sex"],axis=1)