DataFrame數據操作補充、透視表、分組與聚合、數據的合並縱向和橫向和可視化模塊matplotlib


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()

返回目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM