一文帶你詳解Python如何使用Pandas玩轉(zhuǎn)表格數(shù)據(jù)
一、Pandas 是什么
Pandas 是 Python 生態(tài)系統(tǒng)中最重要的數(shù)據(jù)分析庫(kù)之一,由 Wes McKinney 于2008年開(kāi)發(fā)。它建立在 NumPy 之上,提供了高性能、易用的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具,讓處理結(jié)構(gòu)化數(shù)據(jù)變得前所未有的簡(jiǎn)單。
核心定位
- 數(shù)據(jù)清洗:處理缺失值、重復(fù)數(shù)據(jù)、格式轉(zhuǎn)換
- 數(shù)據(jù)轉(zhuǎn)換:合并、重塑、透 視表
- 數(shù)據(jù)分析:分組統(tǒng)計(jì)、時(shí)間序列分析
- 數(shù)據(jù)可視化:與 Matplotlib/Seaborn 無(wú)縫集成
二、核心數(shù)據(jù)結(jié)構(gòu)
Pandas 提供兩種主要的數(shù)據(jù)結(jié)構(gòu),理解它們是掌握 Pandas 的關(guān)鍵。
2.1 Series(一維數(shù)據(jù))
Series 是帶標(biāo)簽的一維數(shù)組,可以存儲(chǔ)任意數(shù)據(jù)類型。
import pandas as pd import numpy as np ? # 創(chuàng)建 Series s = pd.Series([1, 3, 5, np.nan, 6, 8]) print(s)
輸出:
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
關(guān)鍵特性:
- 自動(dòng)索引(0,1,2...)或自定義索引
- 支持缺失值(NaN)
- 支持向量化運(yùn)算
2.2 DataFrame(二維數(shù)據(jù))
DataFrame 是帶標(biāo)簽的二維表格數(shù)據(jù)結(jié)構(gòu),是 Pandas 最常用的對(duì)象。
# 創(chuàng)建 DataFrame
dates = pd.date_range('20260101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
?
print(df)輸出:
A B C D
2026-01-01 0.469112 -0.282863 -1.509059 -1.135632
2026-01-02 1.212112 -0.173215 0.119209 -1.044236
...
DataFrame 構(gòu)成要素:
| 組件 | 說(shuō)明 |
|---|---|
| index | 行標(biāo)簽(行索引) |
| columns | 列標(biāo)簽(列名) |
| values | 底層 NumPy 數(shù)組 |
| dtypes | 每列的數(shù)據(jù)類型 |
三、數(shù)據(jù)讀取與寫入
Pandas 支持幾乎所有主流數(shù)據(jù)格式:
# CSV 文件
df = pd.read_csv('data.csv')
df.to_csv('output.csv', index=False)
?
# Excel 文件
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
df.to_excel('output.xlsx', sheet_name='Sheet1')
?
# SQL 數(shù)據(jù)庫(kù)
from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:')
df.to_sql('my_table', engine)
?
# JSON 數(shù)據(jù)
df = pd.read_json('data.json')
?
# 從字典創(chuàng)建
data = {'name': ['Alice', 'Bob'], 'age': [25, 30]}
df = pd.DataFrame(data)四、數(shù)據(jù)查看與選擇
4.1 基礎(chǔ)查看
df.head(5) # 前5行 df.tail(3) # 后3行 df.shape # 維度 (行數(shù), 列數(shù)) df.columns # 列名 df.index # 索引 df.describe() # 統(tǒng)計(jì)摘要 df.info() # 詳細(xì)信息
4.2 數(shù)據(jù)選擇
Pandas 提供多種選擇數(shù)據(jù)的方式,推薦使用 .loc 和 .iloc:
# 按列選擇 df['A'] # 選擇單列,返回 Series df[['A', 'B']] # 選擇多列,返回 DataFrame ? # 按行選擇(不推薦直接用索引) df[0:3] # 切片選擇前3行 ? # 標(biāo)簽選擇 .loc[] df.loc['20260101'] # 選擇單行 df.loc[:, ['A', 'B']] # 選擇多列 df.loc['20260101':'20260103', 'A':'C'] # 行列切片 ? # 位置選擇 .iloc[] df.iloc[3] # 第4行(從0開(kāi)始) df.iloc[3:5, 0:2] # 行3-4,列0-1 df.iloc[[1, 2, 4], [0, 2]] # 特定行列 ? # 布爾索引(條件篩選) df[df['A'] > 0] # A列大于0的行 df[(df['A'] > 0) & (df['B'] < 0)] # 多條件組合 df[df['A'].isin([1, 2, 3])] # 包含判斷
五、數(shù)據(jù)清洗(Data Cleaning)
真實(shí)數(shù)據(jù)往往 messy,Pandas 提供了強(qiáng)大的清洗工具:
5.1 處理缺失值
# 檢測(cè)缺失值 df.isnull() # 返回布爾矩陣 df.isnull().sum() # 每列缺失值計(jì)數(shù) ? # 刪除缺失值 df.dropna() # 刪除包含NaN的行 df.dropna(axis=1) # 刪除包含NaN的列 df.dropna(how='all') # 只刪除全為NaN的行 ? # 填充缺失值 df.fillna(0) # 用0填充 df.fillna(df.mean()) # 用均值填充 df.fillna(method='ffill') # 前向填充 df.fillna(method='bfill') # 后向填充 df.interpolate() # 插值填充
5.2 處理重復(fù)值
df.duplicated() # 檢測(cè)重復(fù)行 df.drop_duplicates() # 刪除重復(fù)行 df.drop_duplicates(subset=['A', 'B'], keep='last') # 基于特定列
5.3 數(shù)據(jù)類型轉(zhuǎn)換
df['A'].astype(float) # 轉(zhuǎn)換為浮點(diǎn)型
df['B'].astype('category') # 轉(zhuǎn)換為類別型(節(jié)省內(nèi)存)
pd.to_datetime(df['date']) # 轉(zhuǎn)換為日期時(shí)間
pd.to_numeric(df['col'], errors='coerce') # 強(qiáng)制轉(zhuǎn)換,無(wú)效值變NaN5.4 字符串處理
df['name'].str.lower() # 轉(zhuǎn)小寫
df['name'].str.contains('John') # 包含判斷
df['name'].str.replace('a', 'b')# 替換
df['email'].str.split('@') # 分割
df['name'].str[:3] # 切片六、數(shù)據(jù)轉(zhuǎn)換與重塑
6.1 應(yīng)用函數(shù)
# apply:沿軸應(yīng)用函數(shù) df.apply(np.cumsum) # 累積和 df.apply(lambda x: x.max() - x.min()) # 極差 ? # applymap:逐元素應(yīng)用(僅DataFrame) df.applymap(lambda x: len(str(x))) ? # map:僅用于 Series df['A'].map(lambda x: x**2)
6.2 數(shù)據(jù)合并
# concat:軸向連接 pd.concat([df1, df2]) # 縱向拼接(行) pd.concat([df1, df2], axis=1) # 橫向拼接(列) ? # merge:數(shù)據(jù)庫(kù)風(fēng)格的合并 pd.merge(df1, df2, on='key') # 內(nèi)連接 pd.merge(df1, df2, on='key', how='left') # 左連接 pd.merge(df1, df2, left_on='lkey', right_on='rkey') # 不同鍵名 ? # join:基于索引合并 df1.join(df2, how='outer')
6.3 數(shù)據(jù)重塑
# pivot:透 視表 df.pivot(index='date', columns='variable', values='value') ? # melt:寬格式轉(zhuǎn)長(zhǎng)格式 pd.melt(df, id_vars=['id'], value_vars=['A', 'B']) ? # stack/unstack:層級(jí)索引操作 df.stack() # 列旋轉(zhuǎn)為行 df.unstack() # 行旋轉(zhuǎn)為列 ? # pivot_table:高級(jí)透 視表 df.pivot_table(values='D', index='A', columns='B', aggfunc=np.sum)
七、分組與聚合(GroupBy)
這是 Pandas 最強(qiáng)大的功能之一,遵循 Split-Apply-Combine 策略:
# 基礎(chǔ)分組
df.groupby('A').sum() # 按A分組求和
df.groupby(['A', 'B']).mean() # 多列分組求均值
?
# 多聚合操作
df.groupby('A').agg({
'B': ['min', 'max', 'mean'],
'C': 'sum'
})
?
# 轉(zhuǎn)換(保持原形狀)
df.groupby('A').transform(lambda x: (x - x.mean()) / x.std())
?
# 過(guò)濾
df.groupby('A').filter(lambda x: x['B'].sum() > 100)
?
# apply:自定義操作
df.groupby('A').apply(lambda x: x.sort_values('B').iloc[0])八、時(shí)間序列處理
Pandas 最初就是為金融時(shí)間序列分析設(shè)計(jì)的:
# 創(chuàng)建時(shí)間范圍
rng = pd.date_range('2026-01-01', periods=100, freq='D') # 日頻
rng = pd.date_range('2026-01-01', periods=12, freq='M') # 月頻
?
# 時(shí)間索引
ts = pd.Series(np.random.randn(len(rng)), index=rng)
?
# 重采樣(Resampling)
ts.resample('M').mean() # 降采樣:月均值
ts.resample('D').interpolate() # 升采樣:插值
?
# 移動(dòng)窗口
ts.rolling(window=7).mean() # 7日移動(dòng)平均
ts.expanding().sum() # 擴(kuò)展窗口求和
?
# 時(shí)間偏移
ts.shift(1) # 滯后1期
ts.shift(-1) # 超前1期
?
# 時(shí)區(qū)處理
ts_utc = ts.tz_localize('UTC')
ts_sh = ts_utc.tz_convert('Asia/Shanghai')九、性能優(yōu)化技巧
9.1 內(nèi)存優(yōu)化
# 查看內(nèi)存使用
df.info(memory_usage='deep')
?
# 優(yōu)化數(shù)據(jù)類型
df['int_col'] = df['int_col'].astype('int32') # 默認(rèn) int64 → int32
df['float_col'] = df['float_col'].astype('float32')
df['category_col'] = df['category_col'].astype('category') # 類別型9.2 向量化操作
避免循環(huán),使用向量化操作:
# ? 慢:Python 循環(huán)
result = []
for idx, row in df.iterrows():
result.append(row['A'] + row['B'])
?
# ? 快:向量化
result = df['A'] + df['B']
?
# ? 更快:NumPy 底層
result = df['A'].values + df['B'].values9.3 使用 eval/query
# 大型 DataFrame 的表達(dá)式計(jì)算
df.eval('C = A + B', inplace=True)
df.query('A > 0 and B < 0')思考題:在處理一個(gè) 10GB 的 CSV 文件時(shí),如何在不耗盡內(nèi)存的情況下計(jì)算某列的均值?(提示:考慮 chunksize 參數(shù)或 Dask)
十、實(shí)戰(zhàn)案例:數(shù)據(jù)分析流程
下面是一個(gè)完整的數(shù)據(jù)分析流程示例:
import pandas as pd
import numpy as np
?
# 1. 加載數(shù)據(jù)
df = pd.read_csv('sales_data.csv', parse_dates=['date'])
?
# 2. 數(shù)據(jù)清洗
df.drop_duplicates(inplace=True)
df.dropna(subset=['sales', 'quantity'], inplace=True)
df['category'] = df['category'].astype('category')
?
# 3. 特征工程
df['revenue'] = df['sales'] * df['quantity']
df['month'] = df['date'].dt.to_period('M')
?
# 4. 數(shù)據(jù)分析
monthly_sales = df.groupby('month')['revenue'].sum()
category_stats = df.groupby('category').agg({
'revenue': ['sum', 'mean', 'count'],
'quantity': 'sum'
})
?
# 5. 透 視分析
pivot = df.pivot_table(
values='revenue',
index='month',
columns='category',
aggfunc='sum',
fill_value=0
)
?
# 6. 導(dǎo)出結(jié)果
monthly_sales.to_csv('monthly_report.csv')
category_stats.to_excel('category_report.xlsx')十一、Pandas 3.0 新特性(2024+)
Pandas 3.0 帶來(lái)了重大更新:
- PyArrow 后端:默認(rèn)使用 PyArrow 字符串類型,大幅減少內(nèi)存占用
- Copy-on-Write:默認(rèn)啟用,避免意外的數(shù)據(jù)修改
- 改進(jìn)的異常信息:更清晰的錯(cuò)誤提示
- 棄用警告:移除舊版棄用功能
# 啟用 PyArrow 后端(推薦)
df = pd.read_csv('data.csv', dtype_backend='pyarrow')十二、學(xué)習(xí)資源推薦
| 資源 | 鏈接 | 說(shuō)明 |
|---|---|---|
| 官方文檔 | pandas.pydata.org | 最權(quán)威參考 |
| Pandas Cookbook | GitHub 搜索 | 實(shí)戰(zhàn)技巧合集 |
| 《Python for Data Analysis》 | Wes McKinney 著 | 作者親著 |
| Kaggle Learn | kaggle.com/learn | 免費(fèi)交互課程 |
Pandas 是 Python 數(shù)據(jù)科學(xué)生態(tài)的基石,掌握它需要:
- 理解數(shù)據(jù)結(jié)構(gòu):Series 和 DataFrame 的本質(zhì)
- 熟練選擇數(shù)據(jù):loc/iloc 的區(qū)別與應(yīng)用場(chǎng)景
- 掌握清洗技巧:處理真實(shí)世界的臟數(shù)據(jù)
- 善用分組聚合:高效的數(shù)據(jù)匯總分析
- 注意性能優(yōu)化:避免低效循環(huán),善用向量化
最佳實(shí)踐建議:
- 始終使用
.loc和.iloc而不是鏈?zhǔn)剿饕?code>df[...][...]) - 處理大型數(shù)據(jù)集時(shí)考慮使用 PyArrow 或 Dask
- 善用
inplace=True減少內(nèi)存拷貝(但要注意副作用) - 代碼中保留數(shù)據(jù)處理的注釋,便于復(fù)現(xiàn)分析流程
到此這篇關(guān)于一文帶你詳解Python如何使用Pandas玩轉(zhuǎn)表格數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Python Pandas數(shù)據(jù)分析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python如何利用Har文件進(jìn)行遍歷指定字典替換提交的數(shù)據(jù)詳解
這篇文章主要給大家介紹了關(guān)于Python如何利用Har文件進(jìn)行遍歷指定字典替換提交的數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Python中matplotlib庫(kù)安裝失敗的經(jīng)驗(yàn)總結(jié)(附pycharm配置anaconda)
最近根據(jù)領(lǐng)導(dǎo)布置的學(xué)習(xí)任務(wù),開(kāi)始學(xué)習(xí)python中的matplotlib,朋友告訴我這個(gè)很簡(jiǎn)單,然而剛踏入安裝的門檻,就遇到了安裝不成功的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Python中matplotlib庫(kù)安裝失敗的經(jīng)驗(yàn)總結(jié),需要的朋友可以參考下2022-08-08
關(guān)于python實(shí)現(xiàn)requests接口測(cè)試的問(wèn)題
requests是一個(gè)很實(shí)用的Python HTTP客戶端庫(kù),Requests是Python語(yǔ)言的第三方的庫(kù),專門用于發(fā)送HTTP請(qǐng)求,這篇文章主要介紹了python實(shí)現(xiàn)requests接口測(cè)試,需要的朋友可以參考下2021-10-10
Python打包成.exe可執(zhí)行文件的詳細(xì)步驟
在Python中,可以使用一些工具將Python代碼打包成可執(zhí)行文件(.exe)以便在沒(méi)有安裝Python解釋器的環(huán)境中運(yùn)行,本文通過(guò)圖文結(jié)合的方式給大家詳細(xì)介紹了Python打包成.exe可執(zhí)行文件的步驟,需要的朋友可以參考下2024-04-04
python使用Berkeley DB數(shù)據(jù)庫(kù)實(shí)例
這篇文章主要介紹了python使用Berkeley DB數(shù)據(jù)庫(kù)的方法,以實(shí)例形式講述了完整的操作過(guò)程,并總結(jié)了具體的操作步驟,非常具有實(shí)用性,需要的朋友可以參考下2014-09-09
利用python在excel里面直接使用sql函數(shù)的方法
今天小編就為大家分享一篇利用python在excel里面直接使用sql函數(shù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
Python Django教程之實(shí)現(xiàn)天氣應(yīng)用程序
Django提供了一個(gè)基于Python Web框架的Web框架,允許快速開(kāi)發(fā)和干凈,務(wù)實(shí)的設(shè)計(jì)。在本教程中,我們將學(xué)習(xí)如何創(chuàng)建一個(gè)使用Django作為后端的天氣應(yīng)用程序,感興趣的可以嘗試一下2022-10-10

