國內(nèi)做批發(fā)的網(wǎng)站百度醫(yī)生在線問診
接上篇《60、Pandas中DataFrame對(duì)象的操作(一)》
上一篇我們講解了DataFrame對(duì)象的簡介、基本操作及數(shù)據(jù)清洗相關(guān)的內(nèi)容。本篇我們來繼續(xù)講解DataFrame對(duì)象的統(tǒng)計(jì)分析、可視化以及數(shù)據(jù)導(dǎo)出與保存相關(guān)內(nèi)容。
一、DataFrame的統(tǒng)計(jì)分析
在數(shù)據(jù)分析和處理中,Pandas的DataFrame提供了強(qiáng)大的統(tǒng)計(jì)分析功能,幫助我們深入理解數(shù)據(jù)的分布、趨勢(shì)和特征。以下將詳細(xì)介紹描述性統(tǒng)計(jì)、分組聚合以及數(shù)據(jù)透視表等關(guān)鍵功能。
1、描述性統(tǒng)計(jì)
描述性統(tǒng)計(jì)是數(shù)據(jù)分析的第一步,它通過計(jì)算一系列統(tǒng)計(jì)量來概括數(shù)據(jù)的中心趨勢(shì)、離散程度和分布形態(tài)。在Pandas中,我們可以輕松地對(duì)DataFrame中的數(shù)值列進(jìn)行描述性統(tǒng)計(jì)分析。
●計(jì)算均值(Mean):均值是所有觀測(cè)值的算術(shù)平均值,能夠反映數(shù)據(jù)的中心位置。使用.mean()方法計(jì)算DataFrame中所有數(shù)值列的均值,或者通過指定列名來計(jì)算特定列的均值。
●計(jì)算中位數(shù)(Median):中位數(shù)是將一組數(shù)據(jù)從小到大排列后,位于中間位置的數(shù)。當(dāng)數(shù)據(jù)中存在極端值時(shí),中位數(shù)比均值更能反映數(shù)據(jù)的中心趨勢(shì)。使用.median()方法計(jì)算中位數(shù)。
●計(jì)算眾數(shù)(Mode):眾數(shù)是數(shù)據(jù)集中出現(xiàn)次數(shù)最多的數(shù)。Pandas的DataFrame沒有直接的.mode()方法來計(jì)算眾數(shù),但可以使用scipy.stats.mode或pandas.Series.mode()(對(duì)于Series)來實(shí)現(xiàn)。對(duì)于DataFrame,通常需要先選擇一列,然后應(yīng)用此方法。
●計(jì)算標(biāo)準(zhǔn)差(Standard Deviation):標(biāo)準(zhǔn)差是衡量數(shù)據(jù)離散程度的一種指標(biāo),表示數(shù)據(jù)點(diǎn)與均值的平均距離。使用.std()方法計(jì)算標(biāo)準(zhǔn)差。
# 示例代碼 ?
import pandas as pd
import numpy as np# 創(chuàng)建一個(gè)包含不同類型數(shù)據(jù)的表
data = {'編號(hào)': [1, 2, 3, 4, 5, 6],'姓名': ['張三', '李四', '王五', '趙六', '孫七', '李雷'],'年齡': [25, 30, 28, 22, 35, 25],'薪資': [50000, 60000, 70000, 80000, 40000, 50000],'入職日期': ['2020-01-01', '2021-02-15', '2022-03-01', '2021-04-15', '2020-05-01', '2020-01-01'], ?# 日期時(shí)間字符串'類別': ['A', 'B', 'A', 'C', 'C', 'A'] ?# 分類數(shù)據(jù)
}# 將數(shù)據(jù)字典轉(zhuǎn)換為DataFrame
df = pd.DataFrame(data)print("薪資列均值:", df['薪資'].mean())
print("年齡中位數(shù):", df['年齡'].median())
# 對(duì)于眾數(shù),需要先選擇一列
mode_val = df['類別'].mode()[0]
print("類別眾數(shù):", mode_val)
print("薪資標(biāo)準(zhǔn)差", df['薪資'].std())
測(cè)試結(jié)果:
2、分組聚合
分組聚合是數(shù)據(jù)分析中常用的技術(shù),它允許我們將數(shù)據(jù)按照一個(gè)或多個(gè)鍵進(jìn)行分組,然后對(duì)每個(gè)組應(yīng)用聚合函數(shù)來計(jì)算統(tǒng)計(jì)量。
●使用groupby()方法進(jìn)行分組:groupby()方法根據(jù)一個(gè)或多個(gè)列的值將數(shù)據(jù)分成多個(gè)組。分組后,可以使用聚合函數(shù)對(duì)每組數(shù)據(jù)進(jìn)行操作。
●聚合函數(shù):Pandas提供了多種聚合函數(shù),如sum()(求和)、mean()(均值)、count()(計(jì)數(shù))、max()(最大值)、min()(最小值)等。這些函數(shù)可以直接應(yīng)用于groupby()的結(jié)果上。
# 分組求和
grouped_sum = df.groupby('類別').sum()
print("分組求和(薪資為例):")
print(grouped_sum[['薪資']])# 分組計(jì)算均值,僅對(duì)數(shù)值列操作
numeric_cols = ['年齡', '薪資'] ?# 指定要計(jì)算的數(shù)值列
grouped_mean = df.groupby('類別')[numeric_cols].mean()print("分組計(jì)算均值(薪資和年齡為例):")
print(grouped_mean)
測(cè)試結(jié)果:
3、數(shù)據(jù)透視表
數(shù)據(jù)透視表是一種強(qiáng)大的數(shù)據(jù)分析工具,它能夠以表格的形式展示數(shù)據(jù)的分組匯總信息,便于進(jìn)行數(shù)據(jù)的比較和分析。使用pivot_table()方法創(chuàng)建數(shù)據(jù)透視表:pivot_table()方法能夠根據(jù)一個(gè)或多個(gè)鍵對(duì)數(shù)據(jù)進(jìn)行分組,并對(duì)每個(gè)組應(yīng)用聚合函數(shù)來計(jì)算統(tǒng)計(jì)量。與groupby()相比,pivot_table()提供了更靈活的布局選項(xiàng),如指定行索引、列索引和值。
# 示例代碼 ?
# 創(chuàng)建一個(gè)示例DataFrame
data2 = {'產(chǎn)品': ['蘋果', '香蕉', '蘋果', '橙子', '香蕉', '蘋果', '橙子', '香蕉'],'地區(qū)': ['北方', '南方', '北方', '北方', '南方', '南方', '南方', '北方'],'銷售量': [50, 60, 70, 80, 90, 100, 110, 120],'銷售額': [250, 300, 350, 400, 450, 500, 550, 600]
}df = pd.DataFrame(data2)# 打印原始DataFrame
print("原始DataFrame:")
print(df)# 創(chuàng)建數(shù)據(jù)透視表
# 索引為'產(chǎn)品',列為'地區(qū)',聚合函數(shù)為sum(對(duì)銷售量和銷售額進(jìn)行求和)
pivot_table = pd.pivot_table(df, values=['銷售量', '銷售額'], index=['產(chǎn)品'], columns=['地區(qū)'], aggfunc='sum')# 打印數(shù)據(jù)透視表
print("\n數(shù)據(jù)透視表:")
print(pivot_table)
測(cè)試效果:
在上面的代碼中,values參數(shù)指定了要匯總的列,index參數(shù)指定了行索引列,columns參數(shù)指定了列索引列,aggfunc參數(shù)指定了聚合函數(shù)。通過這種方式,我們可以輕松地創(chuàng)建出復(fù)雜的數(shù)據(jù)透視表,以滿足不同的數(shù)據(jù)分析需求。
二、DataFrame的可視化
在數(shù)據(jù)分析和數(shù)據(jù)科學(xué)領(lǐng)域,數(shù)據(jù)可視化是理解數(shù)據(jù)分布、趨勢(shì)和關(guān)系的關(guān)鍵步驟。Pandas庫雖然主要聚焦于數(shù)據(jù)處理,但它與強(qiáng)大的可視化庫(如Matplotlib和Seaborn)的無縫集成,使得從數(shù)據(jù)處理到數(shù)據(jù)可視化的流程變得極為順暢。以下將詳細(xì)介紹如何使用Pandas結(jié)合Matplotlib和Seaborn庫進(jìn)行DataFrame的可視化。
1、整合Matplotlib進(jìn)行繪圖
Matplotlib是Python中最基礎(chǔ)且廣泛使用的繪圖庫之一,它提供了大量的繪圖功能,能夠生成出版級(jí)別的圖表。Pandas的DataFrame和Series對(duì)象可以直接與Matplotlib集成,方便地將數(shù)據(jù)轉(zhuǎn)換為圖形。
(1)繪制柱狀圖
柱狀圖是展示分類數(shù)據(jù)(如不同類別的銷售量)的一種直觀方式。
import pandas as pd
import matplotlib.pyplot as plt# 示例數(shù)據(jù)
data = {'產(chǎn)品': ['蘋果', '香蕉', '橙子'], '銷售量': [100, 150, 120]}
df = pd.DataFrame(data)# 設(shè)置Matplotlib支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] ?# 設(shè)置為黑體
plt.rcParams['axes.unicode_minus'] = False ?# 解決保存圖像時(shí)負(fù)號(hào)'-'顯示為方塊的問題# 繪制柱狀圖
df.plot(kind='bar', x='產(chǎn)品', y='銷售量')
plt.title('產(chǎn)品銷售量')
plt.xlabel('產(chǎn)品')
plt.ylabel('銷售量')
plt.show()
測(cè)試效果:
(2)繪制折線圖
折線圖常用于展示時(shí)間序列數(shù)據(jù)或連續(xù)變量的變化趨勢(shì)。
# 假設(shè)我們有時(shí)間序列數(shù)據(jù) ?
data = {'日期': ['2023-01', '2023-02', '2023-03'], '銷售額': [200, 250, 300]} ?
df = pd.DataFrame(data) ?
df['日期'] = pd.to_datetime(df['日期']) ?# 確保日期是datetime類型 ?# 繪制折線圖 ?
df.plot(kind='line', x='日期', y='銷售額') ?
plt.title('銷售額變化趨勢(shì)') ?
plt.xlabel('日期') ?
plt.ylabel('銷售額') ?
plt.xticks(rotation=45) ?# 旋轉(zhuǎn)x軸標(biāo)簽以便閱讀 ?
plt.show()
測(cè)試效果:
(3)繪制餅圖
餅圖用于展示各部分在整體中的比例。
# 使用之前的銷售數(shù)據(jù) ?
df.plot(kind='pie', y='銷售量', labels=df['產(chǎn)品'], autopct='%1.1f%%') ?
plt.title('產(chǎn)品銷售量比例') ?
plt.ylabel('') ?# 餅圖通常不需要y軸標(biāo)簽 ?
plt.show()
測(cè)試效果:
2、使用Seaborn庫進(jìn)行更高級(jí)的可視化
Seaborn是基于Matplotlib的高級(jí)繪圖庫,它提供了更多的繪圖功能和更美觀的默認(rèn)樣式,與Pandas的集成也非常方便。
Seaborn能夠自動(dòng)處理Pandas DataFrame的索引和列名,使得繪圖過程更加簡潔。同時(shí),Seaborn提供了多種類型的圖表,如散點(diǎn)圖、箱型圖、熱力圖等,以及用于統(tǒng)計(jì)分析和數(shù)據(jù)探索的功能。
(1)散點(diǎn)圖
散點(diǎn)圖用于展示兩個(gè)變量之間的關(guān)系。
import seaborn as sns ?# 假設(shè)我們有兩個(gè)變量 ?
data = {'體重': [50, 60, 70, 80, 90], '身高': [160, 170, 180, 190, 200]} ?
df = pd.DataFrame(data) ?# 繪制散點(diǎn)圖 ?
sns.scatterplot(x='身高', y='體重', data=df) ?
plt.title('身高與體重的關(guān)系') ?
plt.show()
測(cè)試結(jié)果:
(2)箱型圖
箱型圖用于展示數(shù)據(jù)的分布,包括中位數(shù)、四分位數(shù)、異常值等。
# 使用之前的銷售數(shù)據(jù) ?
sns.boxplot(x='產(chǎn)品', y='銷售量', data=df) ?
plt.title('產(chǎn)品銷售量的分布情況') ?
plt.show()
測(cè)試結(jié)果:
(3)熱力圖
熱力圖用于展示矩陣數(shù)據(jù)中的數(shù)值大小,常用于展示相關(guān)性矩陣或頻率矩陣。
# 繪制熱力圖
# 創(chuàng)建數(shù)據(jù)集
data = {'助攻數(shù)': [4, 5, 5, 6, 7, 8, 8, 10],'籃板數(shù)': [12, 14, 13, 7, 8, 8, 9, 13],'得分': [22, 24, 26, 26, 29, 32, 20, 14]}
df = pd.DataFrame(data)# 計(jì)算相關(guān)矩陣
corr_matrix = df.corr()# 顯示結(jié)果,保留三位小數(shù)
print(corr_matrix.round(3))# 繪制熱力圖
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.show()
測(cè)試結(jié)果:
通過以上示例,我們可以看到Pandas結(jié)合Matplotlib和Seaborn庫能夠輕松實(shí)現(xiàn)DataFrame的可視化,無論是基礎(chǔ)的圖表類型還是更高級(jí)的數(shù)據(jù)可視化需求,都能輕松展示。
三、DataFrame的導(dǎo)出與保存
1、導(dǎo)出為CSV文件
CSV(Comma-Separated Values)是一種常用的文本文件格式,用于存儲(chǔ)表格數(shù)據(jù),包括數(shù)字、文本等。Pandas提供了to_csv()方法,可以方便地將DataFrame導(dǎo)出為CSV文件?!窕居梅?#xff1a;
import pandas as pd# 創(chuàng)建一個(gè)包含不同類型數(shù)據(jù)的表
data = {'編號(hào)': [1, 2, 3, 4, 5, 6],'姓名': ['張三', '李四', '王五', '趙六', '孫七', '李雷'],'年齡': [25, 30, 28, 22, 35, 25],'薪資': [50000, 60000, 70000, 80000, 40000, 50000],'入職日期': ['2020-01-01', '2021-02-15', '2022-03-01', '2021-04-15', '2020-05-01', '2020-01-01'], ?# 日期時(shí)間字符串'類別': ['A', 'B', 'A', 'C', 'C', 'A'] ?# 分類數(shù)據(jù)
}# 將數(shù)據(jù)字典轉(zhuǎn)換為DataFrame
df = pd.DataFrame(data)df.to_csv('data.csv', index=False) ?# index=False表示不保存行索引
●高級(jí)選項(xiàng):
sep:指定字段分隔符,默認(rèn)為逗號(hào),。
encoding:指定文件的編碼格式,如utf-8。
columns:指定要導(dǎo)出的列,通過列名列表實(shí)現(xiàn)。
header:是否寫入列名作為文件頭部,默認(rèn)為True。
效果:
2、導(dǎo)出為Excel文件
Excel文件因其良好的兼容性和用戶友好的界面,在數(shù)據(jù)分析領(lǐng)域廣受歡迎。Pandas通過to_excel()方法支持將DataFrame導(dǎo)出為Excel文件,但需要注意的是,這要求安裝了openpyxl或xlwt庫作為引擎。
●安裝必要的庫(如果尚未安裝):
pip install openpyxl
●基本用法:
df.to_excel('data.xlsx', index=False, engine='openpyxl')
●高級(jí)選項(xiàng):
sheet_name:指定工作表名,默認(rèn)為'Sheet1'。
startrow和startcol:指定開始寫入的行和列(從0開始計(jì)數(shù))。
float_format:浮點(diǎn)數(shù)的格式化字符串,如'%.2f'表示保留兩位小數(shù)。
測(cè)試效果:
3、導(dǎo)出為其他格式(可選)
Pandas不僅限于導(dǎo)出為CSV和Excel文件,還支持多種其他格式,如SQL數(shù)據(jù)庫、JSON文件等,這為數(shù)據(jù)分析師提供了極大的靈活性。
●導(dǎo)出到SQL數(shù)據(jù)庫:
使用to_sql()方法可以將DataFrame直接保存到SQL數(shù)據(jù)庫中。這需要先安裝數(shù)據(jù)庫連接庫(如sqlalchemy和相應(yīng)的數(shù)據(jù)庫驅(qū)動(dòng))。
from sqlalchemy import create_engine ?# 創(chuàng)建數(shù)據(jù)庫連接引擎 ?
engine = create_engine('sqlite:///mydatabase.db') ?# 將DataFrame保存到SQL表 ?
df.to_sql('tablename', con=engine, if_exists='replace', index=False)
●導(dǎo)出為JSON文件:
JSON格式因其輕量級(jí)和易于閱讀的特性,在Web開發(fā)中廣泛應(yīng)用。Pandas的to_json()方法可以將DataFrame轉(zhuǎn)換為JSON格式的字符串或文件。
# 導(dǎo)出為JSON字符串
json_str = df.to_json(orient='records')# 或直接寫入文件
df.to_json('data.json', orient='records', lines=True)
orient參數(shù)控制JSON對(duì)象的結(jié)構(gòu),常見的選項(xiàng)有'split', 'records', 'index', 'columns', 'values', 和 'table'。
測(cè)試效果:
至此,關(guān)于DataFrame對(duì)象的統(tǒng)計(jì)分析、可視化以及數(shù)據(jù)導(dǎo)出與保存相關(guān)內(nèi)容已介紹完畢,下一篇我們來講解DataFrame對(duì)象的案例實(shí)踐。
轉(zhuǎn)載請(qǐng)注明出處:https://guangzai.blog.csdn.net/article/details/140753857