Pandas中數(shù)據(jù)清洗與高效分析全攻略
前言
在數(shù)據(jù)科學(xué)和數(shù)據(jù)分析領(lǐng)域,Pandas無疑是Python生態(tài)中最強(qiáng)大的數(shù)據(jù)處理庫之一。然而,很多開發(fā)者僅停留在基礎(chǔ)的read_csv和groupby操作上,未能充分發(fā)揮Pandas的真正威力。本文將深入探討Pandas的高階用法,聚焦數(shù)據(jù)清洗和高效分析兩大核心場景,帶你解鎖Pandas的進(jìn)階技能!
一、高效數(shù)據(jù)讀取與初步探索
1.1 智能讀取大數(shù)據(jù)集
import pandas as pd
# 分塊讀取大數(shù)據(jù)集
chunk_iter = pd.read_csv('large_dataset.csv', chunksize=100000)
for chunk in chunk_iter:
process(chunk) # 自定義處理函數(shù)
# 只讀取需要的列
cols = ['id', 'name', 'value']
df = pd.read_csv('data.csv', usecols=cols)
# 指定數(shù)據(jù)類型減少內(nèi)存占用
dtypes = {'id': 'int32', 'price': 'float32'}
df = pd.read_csv('data.csv', dtype=dtypes)
1.2 數(shù)據(jù)概覽高階技巧
# 顯示所有列的統(tǒng)計(jì)信息(包括非數(shù)值列)
df.describe(include='all')
# 檢查內(nèi)存使用情況
df.info(memory_usage='deep')
# 唯一值及其計(jì)數(shù)的高級展示
for col in df.select_dtypes(include=['object']).columns:
print(f"\n{col}的值分布:")
print(df[col].value_counts(dropna=False).head(10))
二、高級數(shù)據(jù)清洗技術(shù)
2.1 智能處理缺失值
# 可視化缺失值
import missingno as msno
msno.matrix(df)
# 基于規(guī)則填充缺失值
df['salary'] = df.groupby('department')['salary'].apply(
lambda x: x.fillna(x.mean())
)
# 創(chuàng)建缺失值指示特征
df['age_missing'] = df['age'].isna().astype(int)
2.2 異常值檢測與處理
# 使用IQR方法檢測異常值
def detect_outliers(df, col):
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
return ~df[col].between(lower_bound, upper_bound)
outliers = detect_outliers(df, 'price')
df['price_cleaned'] = np.where(outliers, np.nan, df['price'])
# 使用Z-score處理異常值
from scipy import stats
df['z_score'] = np.abs(stats.zscore(df['value']))
df['value_cleaned'] = np.where(df['z_score'] > 3, np.nan, df['value'])
2.3 高級字符串處理
# 使用正則表達(dá)式提取信息
df['phone_area'] = df['phone'].str.extract(r'\((\d{3})\)')
# 向量化的字符串操作
df['name'] = df['first_name'].str.cat(df['last_name'], sep=' ')
# 使用fuzzywuzzy進(jìn)行模糊匹配
from fuzzywuzzy import fuzz
df['similarity'] = df.apply(
lambda x: fuzz.ratio(x['name1'], x['name2']), axis=1
)
三、高效數(shù)據(jù)轉(zhuǎn)換技巧
3.1 高級分組聚合
# 同時(shí)計(jì)算多個(gè)聚合函數(shù)
agg_funcs = {
'sales': ['sum', 'mean', 'max'],
'profit': lambda x: (x > 0).mean() # 盈利比例
}
result = df.groupby('region').agg(agg_funcs)
# 使用transform保持原始DataFrame形狀
df['dept_avg_salary'] = df.groupby('department')['salary'].transform('mean')
# 使用pivot_table進(jìn)行透視
pd.pivot_table(df, values='sales', index='region',
columns='quarter', aggfunc=np.sum,
margins=True, margins_name='總計(jì)')
3.2 高性能數(shù)據(jù)合并
# 基于索引的快速合并 df1.join(df2, how='left') # 使用merge的indicator參數(shù)跟蹤合并來源 pd.merge(df1, df2, on='key', how='outer', indicator=True) # 使用concat進(jìn)行軸向合并 pd.concat([df1, df2], axis=1, keys=['2022', '2023'])
3.3 時(shí)間序列高級處理
# 重采樣與滾動(dòng)窗口
df.set_index('date').resample('W').mean() # 按周重采樣
df.rolling(window='30D').mean() # 30天滾動(dòng)平均
# 處理時(shí)區(qū)
df['timestamp'] = df['timestamp'].dt.tz_localize('UTC').dt.tz_convert('Asia/Shanghai')
# 時(shí)間特征工程
df['hour'] = df['timestamp'].dt.hour
df['is_weekend'] = df['timestamp'].dt.dayofweek >= 5
四、內(nèi)存優(yōu)化與性能提升
4.1 數(shù)據(jù)類型優(yōu)化
# 自動(dòng)優(yōu)化數(shù)據(jù)類型
def optimize_dtypes(df):
for col in df.columns:
col_type = df[col].dtype
if col_type == 'object':
num_unique = df[col].nunique()
if num_unique / len(df) < 0.5:
df[col] = df[col].astype('category')
elif col_type == 'float64':
df[col] = pd.to_numeric(df[col], downcast='float')
elif col_type == 'int64':
df[col] = pd.to_numeric(df[col], downcast='integer')
return df
???????df = optimize_dtypes(df)4.2 并行處理加速
# 使用swifter加速apply操作
import swifter
df['new_col'] = df['text'].swifter.apply(process_text)
# 使用modin替代pandas實(shí)現(xiàn)并行處理
import modin.pandas as mpd
df = mpd.read_csv('large_file.csv')
4.3 高效迭代方法對比
# 各種迭代方法的性能比較
def iterrows_example(df):
for index, row in df.iterrows():
process(row)
def itertuples_example(df):
for row in df.itertuples():
process(row)
def vectorized_example(df):
df['new_col'] = df['col1'] + df['col2']
# 向量化操作通常比迭代快100-1000倍
五、實(shí)戰(zhàn)案例:電商數(shù)據(jù)分析
# 1. 數(shù)據(jù)加載與初步清洗
df = pd.read_csv('ecommerce.csv', parse_dates=['order_date'])
df = df[df['order_amount'] > 0] # 過濾無效訂單
# 2. RFM分析
snapshot_date = df['order_date'].max() + pd.Timedelta(days=1)
rfm = df.groupby('customer_id').agg({
'order_date': lambda x: (snapshot_date - x.max()).days,
'order_id': 'count',
'order_amount': 'sum'
})
rfm.columns = ['recency', 'frequency', 'monetary']
# 3. RFM分箱與評分
rfm['R_score'] = pd.qcut(rfm['recency'], 5, labels=[5,4,3,2,1])
rfm['F_score'] = pd.qcut(rfm['frequency'], 5, labels=[1,2,3,4,5])
rfm['M_score'] = pd.qcut(rfm['monetary'], 5, labels=[1,2,3,4,5])
rfm['RFM_score'] = rfm[['R_score','F_score','M_score']].sum(axis=1)
# 4. 客戶分層
seg_map = {
r'[12-15]': '高價(jià)值客戶',
r'[9-11]': '潛力客戶',
r'[6-8]': '一般客戶',
r'[3-5]': '流失風(fēng)險(xiǎn)客戶'
}
rfm['segment'] = rfm['RFM_score'].astype('str').replace(seg_map, regex=True)
六、Pandas性能優(yōu)化黃金法則
避免循環(huán):盡量使用向量化操作和內(nèi)置函數(shù)
選擇正確的數(shù)據(jù)類型:category類型可以大幅減少內(nèi)存使用
使用查詢優(yōu)化:.query()方法通常比布爾索引更快
合理使用索引:設(shè)置索引可以加速查詢和合并操作
分批處理大數(shù)據(jù):使用chunksize參數(shù)處理無法一次性加載的數(shù)據(jù)
利用eval和query:對于復(fù)雜表達(dá)式,可以顯著提高性能
df.eval('result = (col1 + col2) / col3', inplace=True)
結(jié)語
Pandas的高階功能可以讓你在數(shù)據(jù)清洗和分析工作中事半功倍。本文介紹的技術(shù)涵蓋了從數(shù)據(jù)讀取、清洗、轉(zhuǎn)換到性能優(yōu)化的全流程高級操作。掌握這些技巧后,你將能夠處理更復(fù)雜的數(shù)據(jù)分析任務(wù),并以更高的效率完成工作。
記住,熟練使用Pandas的關(guān)鍵在于理解其底層設(shè)計(jì)原理(如向量化操作)和不斷實(shí)踐。建議讀者將本文中的示例代碼應(yīng)用到自己的項(xiàng)目中,逐步掌握這些高階技巧。
到此這篇關(guān)于Pandas高階用法之?dāng)?shù)據(jù)清洗與高效分析全攻略的文章就介紹到這了,更多相關(guān)Pandas數(shù)據(jù)清洗與分析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python爬蟲小技巧之偽造隨機(jī)的User-Agent
這篇文章主要給大家介紹了關(guān)于Python爬蟲小技巧之偽造隨機(jī)的User-Agent的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
聊聊Pytorch torch.cat與torch.stack的區(qū)別
這篇文章主要介紹了Pytorch torch.cat與torch.stack的區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
在Python中如何優(yōu)雅地創(chuàng)建表格的實(shí)現(xiàn)
本文主要介紹了在Python中如何優(yōu)雅地創(chuàng)建表格的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
使用pyqt5 實(shí)現(xiàn)ComboBox的鼠標(biāo)點(diǎn)擊觸發(fā)事件
這篇文章主要介紹了使用pyqt5 實(shí)現(xiàn)ComboBox的鼠標(biāo)點(diǎn)擊觸發(fā)事件,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
pytorch中函數(shù)tensor.numpy()的數(shù)據(jù)類型解析
這篇文章主要介紹了pytorch中函數(shù)tensor.numpy()的數(shù)據(jù)類型,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07

