Pandas 1.5.3 实战Excel 数据清洗与转换的 5 个高阶场景1. 缺失值处理的智能策略数据清洗中最常见的挑战莫过于缺失值处理。Pandas 1.5.3 提供了比以往更强大的工具链来处理这个难题。让我们从一个真实的销售数据集开始import pandas as pd sales_data pd.read_excel(sales_records.xlsx, engineopenpyxl) print(sales_data.isna().sum())缺失值诊断矩阵可以帮助我们快速定位问题列名缺失数量缺失比例数据类型customer_id122.3%int64product_name00%objectunit_price458.7%float64quantity71.4%int64对于不同场景我们有多种处理方案时间序列填充使用前后时间点的平均值sales_data[unit_price] sales_data[unit_price].interpolate(methodtime)分组填充按产品类别填充中位数sales_data[unit_price] sales_data.groupby(product_category)[unit_price]\ .transform(lambda x: x.fillna(x.median()))标记异常值创建新列标识填充记录sales_data[price_imputed] sales_data[unit_price].isna().astype(int) sales_data[unit_price] sales_data[unit_price].fillna(sales_data[unit_price].median())提示在金融领域建议保留原始缺失状态并创建新列存储填充值这对后续模型训练至关重要。2. 类型转换与内存优化Pandas 的数据类型系统远比表面看起来复杂。观察这个内存使用案例# 转换前内存使用 original_mem sales_data.memory_usage(deepTrue).sum() # 优化类型 sales_data[customer_id] pd.to_numeric(sales_data[customer_id], downcastinteger) sales_data[unit_price] pd.to_numeric(sales_data[unit_price], downcastfloat) sales_data[order_date] pd.to_datetime(sales_data[order_date]) # 转换后内存使用 optimized_mem sales_data.memory_usage(deepTrue).sum() print(f内存节省: {(original_mem - optimized_mem)/original_mem:.1%})分类数据的黄金法则基数小于总行数10% → 使用category类型高频字符串字段 → 优先考虑category参与数值计算的字段 → 保持数值类型# 智能类型转换函数 def auto_convert(df, col): if df[col].dtype object: if df[col].nunique() / len(df) 0.1: return df[col].astype(category) return df[col] for col in sales_data.columns: sales_data[col] auto_convert(sales_data, col)3. 多表合并的进阶技巧真实业务中我们常需要合并多个数据源。假设我们有销售记录表客户信息表产品目录表合并策略对比表合并类型适用场景代码示例内存消耗内连接只保留匹配记录pd.merge(sales, clients)低左连接保留所有左表记录pd.merge(sales, clients, howleft)中外连接保留所有记录pd.merge(sales, clients, howouter)高索引连接大数据集合并sales.join(clients.set_index(id), onclient_id)最低对于大型数据集可以使用merge的优化参数merged_data pd.merge( sales_data, client_info, onclient_id, validatemany_to_one, # 确保关系正确性 indicatorTrue, # 跟踪记录来源 suffixes(_sales, _client) )性能优化技巧合并前对连接键排序可提升30%速度使用pd.concat()代替merge处理相同结构的表大数据集考虑dask.dataframe4. 条件筛选的工程实践复杂条件筛选是业务分析的核心。Pandas 1.5.3 优化了布尔索引的性能# 基础筛选 q3_sales sales_data[ (sales_data[order_date].dt.quarter 3) (sales_data[region].isin([West, East])) (sales_data[quantity] 10) ] # 使用query方法更易读 high_value sales_data.query( unit_price 100 and loyalty_status Gold and product_category ! Clearance )动态条件构建技巧conditions [] if include_east_region: conditions.append(df[region] East) if min_price: conditions.append(df[unit_price] min_price) final_condition pd.concat(conditions, axis1).all(axis1) filtered_data sales_data[final_condition]对于时间序列数据可以使用between_time和at_time# 获取每天上午的交易 morning_sales sales_data.set_index(order_date)\ .between_time(09:00, 12:00)\ .reset_index()5. 分组聚合的深度应用分组聚合远不止groupby().sum()那么简单。看这个多维度分析案例# 多级分组与自定义聚合 results (sales_data .groupby([region, pd.Grouper(keyorder_date, freqM)]) .agg({ quantity: [sum, mean], unit_price: lambda x: (x * sales_data.loc[x.index, quantity]).sum(), client_id: pd.Series.nunique }) .rename(columns{ lambda: revenue, client_id: unique_clients }) )分组优化技巧使用pd.Grouper进行时间分组大数据集考虑methodhash参数避免在分组后立即计算使用.pipe()延迟执行透视表高级用法pivot pd.pivot_table( sales_data, valuesunit_price, index[region, sales_rep], columnspd.cut(sales_data[order_date].dt.month, bins[0,3,6,9,12]), aggfunc[mean, count], marginsTrue, fill_value0 )对于超大数据集可以使用eval()进行链式操作优化sales_data sales_data.eval( total unit_price * quantity discount_amount total * discount_rate / 100 net_value total - discount_amount )