一、前言
在数据科学和数据分析领域,pandas无疑是python生态系统中最强大的数据处理库之一。本文将深入探讨pandas的高阶用法,重点介绍数据清洗和高效分析的技巧,帮助您从pandas初级用户成长为高级数据分析师。
二、pandas核心数据结构回顾
series与dataframe
import pandas as pd
# 创建series
s = pd.series([1, 3, 5, np.nan, 6, 8])
# 创建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'
})
三、高级数据清洗技巧
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 检测异常值
# 使用描述性统计 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 数据转换
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 类别型数据编码
# one-hot编码 pd.get_dummies(df, columns=['categorical_col']) # label编码 from sklearn.preprocessing import labelencoder df['encoded'] = labelencoder().fit_transform(df['categorical_col'])
四、高效数据分析技巧
4.1 高性能数据处理
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类型节省内存
# 转换category类型
df['category_col'] = df['category_col'].astype('category')
# 查看内存使用
df.memory_usage(deep=true)
4.2 高级分组操作
4.2.1 agg聚合函数
# 多函数聚合
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灵活应用函数
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()
# 自定义滚动函数
def custom_roll(x):
return x[-1] * 2 + x[0]
df.rolling(window=3).apply(custom_roll)
五、数据可视化集成
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()
六、性能优化技巧
6.1 使用高效数据类型
# 优化数值类型
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处理大数据
import dask.dataframe as dd
ddf = dd.from_pandas(df, npartitions=4)
result = ddf.groupby('group_col').mean().compute()
七、实战案例:电商数据分析
7.1 数据准备
# 读取数据
orders = pd.read_csv('orders.csv', parse_dates=['order_date'])
products = pd.read_csv('products.csv')
customers = pd.read_csv('customers.csv')
# 合并数据
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在数据清洗和高效分析方面的高阶用法,包括:
高级数据清洗技巧:缺失值处理、异常值检测与处理、数据转换
高效数据分析方法:高性能数据处理、高级分组操作、时间序列分析
数据可视化集成:直接绘图方法和高级可视化技巧
性能优化技巧:数据类型优化、避免链式赋值、并行处理
实战案例:电商数据分析中的rfm模型应用
掌握这些高阶技巧后,您将能够更加高效地处理和分析各种复杂的数据集,为数据驱动的决策提供有力支持。记住,熟练使用pandas的关键在于不断实践和探索其丰富的功能。
到此这篇关于pandas高阶用法之数据清洗与高效分析的完整指南的文章就介绍到这了,更多相关pandas数据清洗与高效分析内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论