數據分析進階 - pandas在數據分析中的應用

前言

記得在去年的時候寫過一篇關於pandas包的簡單使用,具體可見鏈接,但是經過這段時間的學習或者工作,覺得有點低估了pandas能夠在分析中發揮的作用,所以這篇博客將對數據分析整個流程中pandas的使用做一個梳理(不會特別全,但是是比較常用的,後續若有補充會進行更新)。

分析流程

數據讀取

由於數據存儲的形式是多樣的,例如在數據庫或者導出的文檔中,pandas提供了多種讀取數據的方法,下面僅講解最爲常見的三種形式

import pandas as pd
# Excel
df = pd.read_excel('test.xlxs')
# Csv or txt
# 方法中有挺多有利於數據處理的參數設置,具體可以在實操中根據需要學習即可,例如
# header是否首行設爲列名,skiprows要跳過多少行, 空值處理以及時間處理等
df = pd.read_csv('test.csv', sep=",") # 常見的csv文件分割符就是逗號,但要按具體文檔,可能是/t等
df = pd.read_csv('test.txt', sep=" ") # txt文件可以用此方法,也需要注意分割符
# Sql
# 過去比較常用上面兩種形式,然而在工作中也嘗試了直接從數據庫提取,因此重點講此方法
# 對於低版本的pandas可用pymysql
import pymysql
conn = pymysql.connect(host="127.0.0.1",user="root",password="password",db="data")
sql = "select * from data"
df = pd.read_sql(sql, conn)
conn.close() # 取完數據後還是要記得關閉連接

# 對於高版本的pandas會有很大的不同,主要是使用了sqlalchemy
from sqlalchemy import create_engine
engine = "mysql+pymysql://用戶名:密碼@IP/數據庫名?charset=utf8"
sql = "select * from data"
df = pd.read_sql(sql, engine)
數據提取

上一個步驟取出的數據是DataFrame的形式,相當於一個數據表格,如果我們需要對特定的數據進行處理的話,主要有以下的方式

# 查看首尾數據,可加參數n控制行數
df.head()
df.tail()
# 特定列 - test爲列名
df.test
df['test']
df[0] # 列數
# 多列
df[['test1', 'test2']]
# 索引 - [行,列]
df.loc[]   # 通過行標籤
df.iloc[]  # 通過行號
df.ix[] # loc和iloc的混合
# 查詢式 - 類似Excel的篩選
df.query("條件")  # 單條件
df[(條件1) & (條件2)] # 多條件
df[~df.test.isin(data)]   # ~取反
數據預處理
# 列名重命名
df.rename(columns={'列1':'新列1', '列2':'新列2'}
# 瞭解數據
# 查看數據全貌,包括數據類型、空值、統計值等
df.describe()  
df.info()
df.shape
# 空值、重複值處理
# 確定缺失值
df.notnull()
df.isnull()
df.isnull().any() # 獲取含有空值的列
df.isnull().all() # 全部爲空值的列

# 填充爲0 或者均值、中位數
df.fillna(0)   
df.dropna() # 直接丟棄含有NA的行記錄

# 重複
df.duplicated() # 判斷重複數據記錄
df.drop_duplicates() # 刪除數據記錄中所有列值相同的記錄
df.drop_duplicates(subset=['A'],keep='first')  # 指定式刪除重複 
df.drop_duplicates(['col1']) # 刪除數據記錄中col1值相同的記錄
# 數據轉置
df.T
# 時間處理
pd.date_range() # 生成時間序列
pd.to_datetime(df.dates) # 轉換爲datetime對象

# 也可在讀取數據的時候提前修改
df = pd.read_csv('test.csv', parse_dates=['dates'])
# 修改數據類型
df.dtypes # 看數據類型
df['test'] = df['test'].astype('float64')  # 單個處理
df=df.astype({'列1':'float64','列2':'float64'}) # 多個處理
# 數據合併、連接
df.append()  # 疊加
pd.concat()  # 單純的把兩個表拼接在一起,用axis指定行列,不去重
pd.merge() # 類似於關係型數據庫的連接方式(即join)
pd.join()  # 用於索引的合併
數據統計&函數應用
# 數據聚合
df.groupby('test')
df.groupby(['列1’,'列2']
# 統計計算
count() # 顯示非Nan值的數據項數量
median() # 中位數
max() # 最大值
min() # 最小值
mode() # 衆數
std() # 標準差
var() # 方差
# 函數應用 - 搭配numpy
# apply - 可對單列或者多列處理
df.apply(sum)
df.['列1'].apply(lamda x: np.square(x) if x == 2 else x) # 最常搭配匿名函數
df['dates'].apply(pd.to_datetime)  # 也可在此對日期進行處理,方便計算

# agg - 類似apply,但可以指定不同的列用不同的函數
df.groupby(['列1']).agg([sum,mean,max])
df.groupby(['列1']).agg({'列1':sum,'列2':np.mean})
# 數據透視表(類似Excel的操作)
# index爲行,column爲列,aggfunc相當於函數
pd.pivot_table(df, index=['列1', '列2'], columns=['列3'], aggfunc=[np.mean, np.sum, max])
數據可視化
import matplotlib.pyplot as plt
df.plot(x = "a", y = "b")
# 不同的圖形可用kind參數設置
df.plot.bar()  # 條形圖
df.plot.hist(bins=20)  # 直方圖
df.plot.box()  # 箱線圖
df.plot.area() # 面積圖
df.plot.scatter(x='a', y='b') # 散點圖
df.plot.pie(subplots=True)  # 餅圖
plt.show()
數據存儲
df.to_csv('result.csv', sep=',', index=None)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章