Pandas中数据清洗与高效分析全攻略

Written by

in

文章目录
  • 在数据科学和数据分析领域,Pandas无疑是Python生态中最强大的数据处理库之一。然而,很多开发者仅停留在基础的read_csv和groupby操作上,未能充分发挥Pandas的真正威力。本文将深入探讨Pandas的高阶用法,聚焦数据清洗和高效分析两大核心场景,带你解锁Pandas的进阶技能!
  • # 1. 数据加载与初步清洗 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]’: ‘高价值客户’, r'[9-11]’: ‘潜力客户’, r'[6-8]’: ‘一般客户’, r'[3-5]’: ‘流失风险客户’ } rfm[‘segment’] = rfm[‘RFM_score’].astype(‘str’).replace(seg_map, regex=True)
  • 避免循环:尽量使用向量化操作和内置函数 选择正确的数据类型:category类型可以大幅减少内存使用 使用查询优化:.query()方法通常比布尔索引更快 合理使用索引:设置索引可以加速查询和合并操作 分批处理大数据:使用chunksize参数处理无法一次性加载的数据 利用eval和query:对于复杂表达式,可以显著提高性能 df.eval(‘result = (col1 + col2) / col3’, inplace=True)
  • Pandas的高阶功能可以让你在数据清洗和分析工作中事半功倍。本文介绍的技术涵盖了从数据读取、清洗、转换到性能优化的全流程高级操作。掌握这些技巧后,你将能够处理更复杂的数据分析任务,并以更高的效率完成工作。 记住,熟练使用Pandas的关键在于理解其底层设计原理(如向量化操作)和不断实践。建议读者将本文中的示例代码应用到自己的项目中,逐步掌握这些高阶技巧。 到此这篇关于Pandas高阶用法之数据清洗与高效分析全攻略的文章就介绍到这了,更多相关Pandas数据清洗与分析内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Pandas高阶用法之数据清洗与高效分析的完整指南 pandas实现数据读取&清洗&分析的项目实践 深入探讨Pandas数据清洗与高效分析 Pandas 数据清洗的具体使用 Pandas数据清洗与过滤空值技巧 利用pandas进行数据清洗的7种方式 Python使用pandasai实现数据分析
  • 目录
    • 前言
    • 一、高效数据读取与初步探索
      • 1.1 智能读取大数据集
      • 1.2 数据概览高阶技巧
    • 二、高级数据清洗技术
      • 2.1 智能处理缺失值
      • 2.2 异常值检测与处理
      • 2.3 高级字符串处理
    • 三、高效数据转换技巧
      • 3.1 高级分组聚合
      • 3.2 高性能数据合并
      • 3.3 时间序列高级处理
    • 四、内存优化与性能提升
      • 4.1 数据类型优化
      • 4.2 并行处理加速
      • 4.3 高效迭代方法对比
    • 五、实战案例:电商数据分析
      • 六、Pandas性能优化黄金法则
        • 结语

          在数据科学和数据分析领域,Pandas无疑是Python生态中最强大的数据处理库之一。然而,很多开发者仅停留在基础的read_csv和groupby操作上,未能充分发挥Pandas的真正威力。本文将深入探讨Pandas的高阶用法,聚焦数据清洗和高效分析两大核心场景,带你解锁Pandas的进阶技能!

          import pandas as pd
          
          # 分块读取大数据集
          chunk_iter = pd.read_csv('large_dataset.csv', chunksize=100000)
          for chunk in chunk_iter:
              process(chunk)  # 自定义处理函数
          
          # 只读取需要的列
          cols = ['id', 'name', 'value']
          df = pd.read_csv('data.csv', usecols=cols)
          
          # 指定数据类型减少内存占用
          dtypes = {'id': 'int32', 'price': 'float32'}
          df = pd.read_csv('data.csv', dtype=dtypes)
          

          # 显示所有列的统计信息(包括非数值列)
          df.describe(include='all')
          
          # 检查内存使用情况
          df.info(memory_usage='deep')
          # 唯一值及其计数的高级展示
          for col in df.select_dtypes(include=['object']).columns:
              print(f"n{col}的值分布:")
              print(df[col].value_counts(dropna=False).head(10))
          

          # 可视化缺失值
          import missingno as msno
          msno.matrix(df)
          
          # 基于规则填充缺失值
          df['salary'] = df.groupby('department')['salary'].apply(
              lambda x: x.fillna(x.mean())
          )
          
          # 创建缺失值指示特征
          df['age_missing'] = df['age'].isna().astype(int)
          

          # 使用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'])
          

          # 使用正则表达式提取信息
          df['phone_area'] = df['phone'].str.extract(r'((d{3}))')
          
          # 向量化的字符串操作
          df['name'] = df['first_name'].str.cat(df['last_name'], sep=' ')
          
          # 使用fuzzywuzzy进行模糊匹配
          from fuzzywuzzy import fuzz
          df['similarity'] = df.apply(
              lambda x: fuzz.ratio(x['name1'], x['name2']), axis=1
          )
          

          # 同时计算多个聚合函数
          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进行透视
          pd.pivot_table(df, values='sales', index='region',
                         columns='quarter', aggfunc=np.sum,
                         margins=True, margins_name='总计')
          

          # 基于索引的快速合并
          df1.join(df2, how='left')
          
          # 使用merge的indicator参数跟踪合并来源
          pd.merge(df1, df2, on='key', how='outer', indicator=True)
          
          # 使用concat进行轴向合并
          pd.concat([df1, df2], axis=1, keys=['2022', '2023'])
          

          # 重采样与滚动窗口
          df.set_index('date').resample('W').mean()  # 按周重采样
          df.rolling(window='30D').mean()  # 30天滚动平均
          
          # 处理时区
          df['timestamp'] = df['timestamp'].dt.tz_localize('UTC').dt.tz_convert('Asia/Shanghai')
          
          # 时间特征工程
          df['hour'] = df['timestamp'].dt.hour
          df['is_weekend'] = df['timestamp'].dt.dayofweek >= 5
          

          # 自动优化数据类型
          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)

          # 使用swifter加速apply操作
          import swifter
          df['new_col'] = df['text'].swifter.apply(process_text)
          
          # 使用modin替代pandas实现并行处理
          import modin.pandas as mpd
          df = mpd.read_csv('large_file.csv')
          

          # 各种迭代方法的性能比较
          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倍
          

          # 1. 数据加载与初步清洗
          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]': '高价值客户',
              r'[9-11]': '潜力客户',
              r'[6-8]': '一般客户',
              r'[3-5]': '流失风险客户'
          }
          rfm['segment'] = rfm['RFM_score'].astype('str').replace(seg_map, regex=True)
          

          避免循环:尽量使用向量化操作和内置函数

          选择正确的数据类型:category类型可以大幅减少内存使用

          使用查询优化:.query()方法通常比布尔索引更快

          合理使用索引:设置索引可以加速查询和合并操作

          分批处理大数据:使用chunksize参数处理无法一次性加载的数据

          利用eval和query:对于复杂表达式,可以显著提高性能

          df.eval('result = (col1 + col2) / col3', inplace=True)
          

          Pandas的高阶功能可以让你在数据清洗和分析工作中事半功倍。本文介绍的技术涵盖了从数据读取、清洗、转换到性能优化的全流程高级操作。掌握这些技巧后,你将能够处理更复杂的数据分析任务,并以更高的效率完成工作。

          记住,熟练使用Pandas的关键在于理解其底层设计原理(如向量化操作)和不断实践。建议读者将本文中的示例代码应用到自己的项目中,逐步掌握这些高阶技巧。

          到此这篇关于Pandas高阶用法之数据清洗与高效分析全攻略的文章就介绍到这了,更多相关Pandas数据清洗与分析内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

          您可能感兴趣的文章:

          • Pandas高阶用法之数据清洗与高效分析的完整指南
          • pandas实现数据读取&清洗&分析的项目实践
          • 深入探讨Pandas数据清洗与高效分析
          • Pandas 数据清洗的具体使用
          • Pandas数据清洗与过滤空值技巧
          • 利用pandas进行数据清洗的7种方式
          • Python使用pandasai实现数据分析

          站内搜索