Pandas高階用法之數(shù)據(jù)清洗與高效分析的完整指南
一、前言
在數(shù)據(jù)科學和數(shù)據(jù)分析領域,Pandas無疑是Python生態(tài)系統(tǒng)中最強大的數(shù)據(jù)處理庫之一。本文將深入探討Pandas的高階用法,重點介紹數(shù)據(jù)清洗和高效分析的技巧,幫助您從Pandas初級用戶成長為高級數(shù)據(jù)分析師。
二、Pandas核心數(shù)據(jù)結構回顧
Series與DataFrame
import pandas as pd
# 創(chuàng)建Series
s = pd.Series([1, 3, 5, np.nan, 6, 8])
# 創(chuàng)建DataFrame
df = pd.DataFrame({
'A': 1.,
'B': pd.Timestamp('20230101'),
'C': pd.Series(1, index=list(range(4)), dtype='float32'),
'D': np.array([3] * 4, dtype='int32'),
'E': pd.Categorical(["test", "train", "test", "train"]),
'F': 'foo'
})
三、高級數(shù)據(jù)清洗技巧
3.1 缺失值處理
3.1.1 檢測缺失值
# 檢測缺失值 df.isna().sum() # 可視化缺失值 import missingno as msno msno.matrix(df)
3.1.2 處理缺失值
# 刪除缺失值
df.dropna(how='any') # 任何列有缺失就刪除
df.dropna(subset=['col1', 'col2']) # 指定列有缺失才刪除
# 填充缺失值
df.fillna(value={'col1': 0, 'col2': 'unknown'}) # 不同列不同填充值
df.fillna(method='ffill') # 前向填充
df.fillna(method='bfill', limit=2) # 后向填充,最多填充2個
# 插值法填充
df.interpolate(method='linear') # 線性插值
df.interpolate(method='time') # 時間序列插值
3.2 異常值處理
3.2.1 檢測異常值
# 使用描述性統(tǒng)計 df.describe() # 使用Z-score方法 from scipy import stats z_scores = stats.zscore(df['numeric_col']) abs_z_scores = np.abs(z_scores) filtered_entries = (abs_z_scores < 3) df_clean = df[filtered_entries] # 使用IQR方法 Q1 = df['numeric_col'].quantile(0.25) Q3 = df['numeric_col'].quantile(0.75) IQR = Q3 - Q1 df_clean = df[~((df['numeric_col'] < (Q1 - 1.5 * IQR)) | (df['numeric_col'] > (Q3 + 1.5 * IQR)))]
3.2.2 處理異常值
# 替換為邊界值
df['numeric_col'] = np.where(df['numeric_col'] > upper_bound, upper_bound,
np.where(df['numeric_col'] < lower_bound, lower_bound, df['numeric_col']))
# 使用分箱處理
df['binned'] = pd.cut(df['numeric_col'], bins=5, labels=False)
3.3 數(shù)據(jù)轉換
3.3.1 標準化與歸一化
# Min-Max歸一化 df['normalized'] = (df['col'] - df['col'].min()) / (df['col'].max() - df['col'].min()) # Z-score標準化 df['standardized'] = (df['col'] - df['col'].mean()) / df['col'].std()
3.3.2 類別型數(shù)據(jù)編碼
# One-Hot編碼 pd.get_dummies(df, columns=['categorical_col']) # Label編碼 from sklearn.preprocessing import LabelEncoder df['encoded'] = LabelEncoder().fit_transform(df['categorical_col'])
四、高效數(shù)據(jù)分析技巧
4.1 高性能數(shù)據(jù)處理
4.1.1 使用eval()和query()
# eval方法加速計算
df.eval('new_col = col1 + col2', inplace=True)
# query方法高效過濾
df.query('col1 > col2 & col3 == "value"')
4.1.2 使用category類型節(jié)省內存
# 轉換category類型
df['category_col'] = df['category_col'].astype('category')
# 查看內存使用
df.memory_usage(deep=True)
4.2 高級分組操作
4.2.1 agg聚合函數(shù)
# 多函數(shù)聚合
df.groupby('group_col').agg({
'col1': ['mean', 'max', 'min'],
'col2': lambda x: np.percentile(x, 95)
})
# 命名聚合(Pandas 0.25+)
df.groupby('group_col').agg(
mean_col1=('col1', 'mean'),
max_col2=('col2', 'max'),
custom=('col3', lambda x: x.std() / x.mean())
)
4.2.2 transform和apply
# transform保持原DataFrame形狀
df['group_mean'] = df.groupby('group_col')['value_col'].transform('mean')
# apply靈活應用函數(shù)
def custom_func(group):
return (group - group.mean()) / group.std()
df.groupby('group_col').apply(custom_func)
4.3 時間序列分析
4.3.1 重采樣
# 降采樣
df.resample('M').mean() # 按月平均
# 升采樣
df.resample('D').ffill() # 按天填充
# 自定義重采樣
def custom_resampler(array_like):
return np.sum(array_like) * 1.5
df.resample('W').apply(custom_resampler)
4.3.2 滾動窗口計算
# 簡單滾動平均
df.rolling(window=7).mean()
# 擴展窗口
df.expanding().sum()
# 自定義滾動函數(shù)
def custom_roll(x):
return x[-1] * 2 + x[0]
df.rolling(window=3).apply(custom_roll)
五、數(shù)據(jù)可視化集成
5.1 直接繪圖
# 線圖 df.plot.line(x='date_col', y=['col1', 'col2'], figsize=(12, 6)) # 箱線圖 df.plot.box(column=['col1', 'col2', 'col3']) # 六邊形箱圖 df.plot.hexbin(x='col1', y='col2', gridsize=20)
5.2 高級可視化技巧
# 使用seaborn集成 import seaborn as sns sns.pairplot(df, hue='category_col') # 使用plotly交互式可視化 import plotly.express as px fig = px.scatter_matrix(df, dimensions=['col1', 'col2', 'col3'], color='category_col') fig.show()
六、性能優(yōu)化技巧
6.1 使用高效數(shù)據(jù)類型
# 優(yōu)化數(shù)值類型
df['int_col'] = pd.to_numeric(df['int_col'], downcast='integer')
df['float_col'] = pd.to_numeric(df['float_col'], downcast='float')
# 使用布爾類型
df['bool_col'] = df['bool_col'].astype('bool')
6.2 避免鏈式賦值
# 不好的做法 - 鏈式賦值 df[df['col'] > 100]['new_col'] = 1 # 可能不會生效 # 好的做法 - 使用loc df.loc[df['col'] > 100, 'new_col'] = 1
6.3 使用并行處理
# 使用swifter加速apply
import swifter
df['new_col'] = df['col'].swifter.apply(lambda x: x*2)
# 使用dask處理大數(shù)據(jù)
import dask.dataframe as dd
ddf = dd.from_pandas(df, npartitions=4)
result = ddf.groupby('group_col').mean().compute()
七、實戰(zhàn)案例:電商數(shù)據(jù)分析
7.1 數(shù)據(jù)準備
# 讀取數(shù)據(jù)
orders = pd.read_csv('orders.csv', parse_dates=['order_date'])
products = pd.read_csv('products.csv')
customers = pd.read_csv('customers.csv')
# 合并數(shù)據(jù)
merged = pd.merge(orders, products, on='product_id')
merged = pd.merge(merged, customers, on='customer_id')
7.2 RFM分析
# 計算RFM指標
now = pd.to_datetime('today')
rfm = merged.groupby('customer_id').agg({
'order_date': lambda x: (now - x.max()).days, # Recency
'order_id': 'count', # Frequency
'total_price': 'sum' # Monetary
}).rename(columns={
'order_date': 'recency',
'order_id': 'frequency',
'total_price': 'monetary'
})
# RFM評分
rfm['r_score'] = pd.qcut(rfm['recency'], q=5, labels=[5,4,3,2,1])
rfm['f_score'] = pd.qcut(rfm['frequency'], q=5, labels=[1,2,3,4,5])
rfm['m_score'] = pd.qcut(rfm['monetary'], q=5, labels=[1,2,3,4,5])
rfm['rfm_score'] = rfm['r_score'].astype(str) + rfm['f_score'].astype(str) + rfm['m_score'].astype(str)
# 客戶分群
segment_map = {
r'[4-5][4-5][4-5]': '高價值客戶',
r'[3-5][3-5][3-5]': '潛力客戶',
r'[1-2][1-2][1-2]': '流失風險客戶',
r'.*': '一般客戶'
}
rfm['segment'] = rfm['rfm_score'].replace(segment_map, regex=True)八、總結
本文全面介紹了Pandas在數(shù)據(jù)清洗和高效分析方面的高階用法,包括:
高級數(shù)據(jù)清洗技巧:缺失值處理、異常值檢測與處理、數(shù)據(jù)轉換
高效數(shù)據(jù)分析方法:高性能數(shù)據(jù)處理、高級分組操作、時間序列分析
數(shù)據(jù)可視化集成:直接繪圖方法和高級可視化技巧
性能優(yōu)化技巧:數(shù)據(jù)類型優(yōu)化、避免鏈式賦值、并行處理
實戰(zhàn)案例:電商數(shù)據(jù)分析中的RFM模型應用
掌握這些高階技巧后,您將能夠更加高效地處理和分析各種復雜的數(shù)據(jù)集,為數(shù)據(jù)驅動的決策提供有力支持。記住,熟練使用Pandas的關鍵在于不斷實踐和探索其豐富的功能。
到此這篇關于Pandas高階用法之數(shù)據(jù)清洗與高效分析的完整指南的文章就介紹到這了,更多相關Pandas數(shù)據(jù)清洗與高效分析內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解Python3之數(shù)據(jù)指紋MD5校驗與對比
這篇文章主要介紹了Python3之數(shù)據(jù)指紋MD5校驗與對比,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-06-06
python uvloop事件循環(huán)庫使用功能示例探究
這篇文章主要為大家介紹了python uvloop事件循環(huán)庫使用功能示例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01
python使用openpyxl實現(xiàn)批量調整字體和樣式
這篇文章主要介紹了python使用openpyxl實現(xiàn)批量調整字體和樣式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-05-05
Python基于Streamlit實現(xiàn)音頻處理示例詳解
這篇文章主要為大家詳細介紹了如何基于Streamlit實現(xiàn)的音頻處理,包含錄音,語音轉文本,文件下載和進度顯示功能,有需要的小伙伴可以參考一下2025-03-03
python人工智能tensorflow常用激活函數(shù)Activation?Functions
這篇文章主要為大家介紹了python人工智能tensorflow常用激活函數(shù)Activation?Functions的匯總介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05

