DataFrame數據操作補充,透視表分組與聚合 和可視化模塊matplotlib
- pandas其他補充操作
- 透視表
- 分組與聚合
- 數據的合並縱向和橫向
- 可視化模塊matplotlib模塊
- 餅圖繪制
- 條形圖繪制
pandas其他補充操作
缺失值的識別與處理
1. df.isnull # 判斷是否為空 2. df.fillna # 填充空格 3. df.dropna # 刪除空格
案例
dal=pd.read_excel(r'dal.xlsx') dal
# 前五個數據 dal.head()
# 統計每個數據項是否有缺失
pla=dal.idnull()
print(pla)
# 統計每列數據數據項是否有缺失 dal.isnull().any(axis=0)
# 計算各列數據的缺失比例 dal.isnull().sum(axis = 0)/dal.shape[0]
# 去除缺失數據
dal.dropna()
d=dal.fillna(value={ # 眾數:以性別中最多的數據為本數據 'gender':dal.gender.mode()[0], # 取age的平均值 'age':dal.age.mean(), # 取工資的中位數 'income':dal.income.median() }, # 確認更改數 inplace =True ) d
具體問題具體分析
在實際工作中,對不同數據進行不同措施
eg:
年齡的缺失用平均值填充
性別用眾數填充
薪資用中位數填充
透視表
透視表功能
語法:
pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All' )
參數介紹
data:指定需要構造透視表的數據集
values:指定需要拉入“數值”框的字段列表
index:指定需要拉入“行標簽”框的字段列表
columns:指定需要拉入“列標簽”框的字段列表
aggfunc:指定數值的統計函數,默認為統計均值,也可以指定numpy模塊中的其他統計函數
fill_value:指定一個標量,用於填充缺失值
margins:bool類型參數,是否需要顯示行或列的總計值,默認為False
dropna:bool類型參數,是否需要刪除整列為缺失的字段,默認為True
margins_name:指定行或列的總計名稱,默認為All
案例
# 讀取d.csv文件數據 dal1=pd.read_csv(r'd.csv') dal1
輸出每個color的price的平均值
pd.pivot_table( # 指定數據dl1 dal1, # 指定行表簽 index='color', # 指定查找的數值 values='price', # 處理數值的函數 aggfunc='mean')
輸出所有color中所有clarity的price值
pd.pivot_table( # 指定數據dal1 dal1, # 指定行表簽 index='color', # 指定列標簽 columns='clarity', # 處理數值的函數 values='price', # 選擇函數 aggfunc='size')
分組與聚合
調用模塊
import numpy as np
分組
語法:
變量名.groupby(by = [參數])
eg:
獲取每個color以cut為單位的數據
gro=dal1.groupby(by = ['color','cut']) # 輸出結果為一個描述性數據 gro
聚合函數的運用
語法:
變量.aggregate({'索引單位':處理函數})
eg:
獲取分組后的統計匯總
res=gro.aggregate({ # 該顏色中的元素有多少個 'color':np.size, # carat的最小值 'carat':np.min, # price平均值 'price':np.mean, # table值的最大值 'table':np.max }) res
調整變量名順序(了解)
語法:
pd.DataFrame(變量, columns=[參數排序])
eg:
調整變量名的順序
res=pd.DataFrame(res,columns=['color','carat','price','table']) res
數據集重命名
語法:
變量.rename(columns={'原名':'新名', '原名':'新名'}, inplace=True)
eg:
res.rename(columns={'color':'num','carat':'weight','price':'avg','table':'max_tab'}, # 確認修改 inplace=True ) res
練習題
分析NBA各球隊冠軍次數及球員FMVP次數
獲取數據,返回結果為一個列表
res2=pd.read_html('https://baike.baidu.com/item/NBA%E6%80%BB%E5%86%A0%E5%86%9B/2173192?fr=aladdin')
# 輸出數據類型
type(res2)
輸出為:list
查看數據
res2
獲取有效數據
dat=res2[0]
dat
drop方法
處理列字段名稱,第0行
# 刪除第0行 datl.drop(0) # 獲取標題 datl.columns=(['年代','時間','冠軍','比分','亞軍','FMVP']) datl
分組方法
語法:
變量.groupby('分組索引')
針對冠軍字段分組
champion.groupby('冠軍').groups
獲取每個隊伍冠軍個數
datl.groupby('冠軍').size()
獲取每個隊伍冠軍個數
datl.groupby('冠軍').aggregate({'冠軍':np.size})
對數據降序排序,ascending=True為降序,False為升序
datl.groupby('冠軍').size().sort_values(ascending=True)
獲取多個數據
datl.groupby(['冠軍', 'FMVP']).size()
數據的合並
縱向合並
語法:
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None)
參數介紹
objs:指定需要合並的對象,可以是序列、數據框或面板數據構成的列表
axis:指定數據合並的軸,默認為0,表示合並多個數據的行,如果為1,就表示合並多個數據的列
join:指定合並的方式,默認為outer,表示合並所有數據,如果改為inner,表示合並公共部分的數據
join_axes:合並數據后,指定保留的數據軸
ignore_index:bool類型的參數,表示是否忽略原數據集的索引,默認為False,如果設為True,就表示忽略原索引並生成新索引
keys:為合並后的數據添加新索引,用於區分各個數據部分
案例使用
構造數據
d1 = pd.DataFrame({
'name':['一','二','三'],
'age':[3,2,1],
'gender':['男','男','男']}
)
d2 = pd.DataFrame({
'name':['四','五'],
'age':[2,1],
'gender':['男','男']}
)
數據集的縱向合並
# keys參數可以在合並之后看到數據來源 pd.concat([d1,d2],keys=['d1','d2'])
保留以前的索引,使用reset_index()
pd.concat([d1,d2],keys=['d1','d2']).reset_index()
去除level_1列數據
語法:
變量.drop(columns='列標簽')
eg:
pd.concat([d1,d2],keys=['d1','d2']).reset_index().drop(columns='level_1')
縱向合並注意
''' 數據源的變量名稱完全相同(變量名順序沒有要求),列數沒有要求 '''
eg:
d3 = pd.DataFrame({ 'name':['丁一','趙五'], 'age':[23,22], 'gender':['女','女'], 'hobbey':['yi','er']} ) # 縱向合並 pd.concat([d1,d3])
橫向合並
語法:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'))
參數:
left:指定需要連接的主 right:指定需要連接的輔表
how:指定連接方式,默認為inner內連,還有其他選項,如左連left、右連right和外連outer on:指定連接兩張表的共同字段
left_on:指定主表中需要連接的共同字段
right_on:指定輔表中需要連接的共同字段
left_index:bool類型參數,是否將主表中的行索引用作表連接的共同字段,默認為False right_index:bool類型參數,
是否將輔表中的行索引用作表連接的共同字段,
默認為False sort:bool類型參數,是否對連接后的數據按照共同字段排序,默認為False
suffixes:如果數據連接的結果中存在重疊的變量名,則使用各自的前綴進行區分
案例:
數據准備
m1=pd.DataFrame({ 'id':[1,2,3], 'name':['一','二','三']}) m2=pd.DataFrame({ 'id':[1,2], 'score':[1,2] }) m3=pd.DataFrame({ 'id':[1,3] 'income':[1,3] })
m1和m2橫向合並
heb1=pd.merge( # 指定主表m1 left=m1, # 指定附表m2 right=m2, # 指定主表 how='left', # 指定主表連結字段 left_on='id', # 指定附表連結字段 right_on='id' ) heb1
新表與m3合並
heb2=pd.merge( # 指定主表m1 left=heb1, # 指定附表m2 right=m3, # 指定主表 how='left', # 指定主表連結字段 left_on='id', # 指定附表連結字段 right_on='id' ) heb2
matplotlib模塊
簡介
是一個強大的python繪圖和數據可視化工具包,數據可視化也是我們數據分析重要環節之一,也是數據分析的最后一個可視化階段
模塊下載
python開發環境下
pip3 install matplotlib -i 網絡地址
anaconda環境下
conda install matplotlib -i 網絡地址 ''' anaconda已經下載好了數據分析相關的模塊,無需再下載 '''
模塊導入
import matplotlib.pyplot as plt
餅圖概念
僅排列在工作表的一列或一行中的數據可以繪制到餅圖中。
餅圖顯示一個數據系列 中各項的大小與各項總和的比例。餅圖中的數據點
(數據點:在圖表中繪制的單個值,這些值由條形、柱形、折線、餅圖或圓環圖的扇面、圓點和其他被稱為數據標記的圖形表示。相同顏色的數據標記組成一個數據系列。)顯示為整個餅圖的百分比。
語法:
pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, labeldistance=1.1)
參數:
x:指定繪圖的數據
explode:指定餅圖某些部分的突出顯示,即呈現爆炸式
labels:為餅圖添加標簽說明,類似於圖例說明
colors:指定餅圖的填充色
autopct:自動添加百分比顯示,可以采用格式化的方法顯示
pctdistance:設置百分比標簽與圓心的距離
labeldistance:設置各扇形標簽(圖例)與圓心的距離
案例:
導入模塊
import matplotlib.pyplot as plt
解決中文亂碼情況
plt.rcParams['font.sans-serif'] = ['SimHei']
構造數據
edu = [0.2515,0.3724,0.3336,0.0368,0.0057] labels = ['一','二','三','四','五'] # 突出三的餅圖數據 explode = [0,0.1,0,0,0]
繪制餅圖
# 如果python版本較低可能是扁的需要加該代碼
plt.axes(aspect='equal')
plt.pie(
# 選擇繪圖數據
x = edu,
# 添加標簽內容
labels=labels,
# 設置百分比的格式,這里保留一位小數
autopct='%.1f%%',
# 獲取突出值
explode = explode
)
%matplotlib
# 顯示圖形
plt.show()
%matplotlib
第一次運行沒有結果,第二次運行時刪除,可以獲取圖片模式
- 軸標簽過長。
- 顯示的數值是持續型的。
- 數據差異大
語法:
bar(x, y, width=0.8, bottom=None, color=None, edgecolor=None, tick_label=None, label = None, ecolor=None)
參數:
x:傳遞數值序列,指定條形圖中x軸上的刻度值 y:傳遞數值序列,指定條形圖y軸上的高度 width:指定條形圖的寬度,默認為0.8 bottom:用於繪制堆疊條形圖 color:指定條形圖的填充色 edgecolor:指定條形圖的邊框色 tick_label:指定條形圖的刻度標簽 label:指定條形圖的標簽,一般用以添加圖例
案例:
調用模塊
# 調用模塊 import pandas as pd # 讀入數據 GDP = pd.read_excel(r'P.xlsx')
繪制圖形
# 設置繪圖風格(不妨使用R語言中的ggplot2風格) plt.style.use('ggplot') # 繪制條形圖 plt.bar( # 指定條形圖x軸的刻度值 x = range(GDP.shape[0]), # 指定條形圖y軸的數值 height = GDP.GDP, # 指定條形圖x軸的刻度標簽 tick_label = GDP.Province, # 指定條形圖的填充色 color = 'red', ) # 顯示圖形 plt.show()
如何取消%matplotlib效果
運行方法與matplotlib一樣
%matplotlib inline
補充操作
# 添加y軸的標簽 plt.ylabel('GDP(萬億)') # 添加條形圖的標題 plt.title('1990年度6個省份GDP分布') # 為每個條形圖添加數值標簽 for x,y in enumerate(GDP.GDP): # 輸入文本數據 plt.text( # 所在x軸的位置 x, # 所在y軸位置的+0.1 y+0.1, # 顯示文本的占位符,四舍五入保留y的一位小數 '%s' %round(y,1), # 為本位制居中 ha='center') # 顯示圖形 plt.show()