• 大数据分析实践 | 过滤和抽样



    python基础 | Pandas基础

    📚相关函数

    🐇数据读取和写入:read_csv和to_csv

    pandas系列 read_csv 与 to_csv 方法各参数详解(全,中文版)
    Pandas–read_csv,to_csv参数说明

    • read_csv:把CSV文件读取为一个DataFrame对象
      • filepath_or_buffer:要读取的CSV文件的路径或文件对象。
      • sep:指定用于分隔字段的字符,默认为逗号(,)。
      • header:指定作为列名的行号,默认为0,表示第一行。
      • index_col:指定作为索引的列号或列名,默认为None,即不使用任何列作为索引。
      • na_values:指定在CSV文件中应被解释为缺失值的值。
      • dtype:指定每列的数据类型,可以使用字典来分别指定每列的数据类型。
      • nrows:指定读取的行数。
      • skiprows:指定跳过的行数。
      • encoding:指定文件编码。
    • to_csv:将DataFrame对象写入到CSV文件中
      • path_or_buf:要写入的CSV文件的路径或文件对象。
      • sep:指定用于分隔字段的字符,默认为逗号(,)。
      • header:指定是否包含列名,默认为True。
      • index:指定是否包含行索引,默认为True。
      • mode:指定写入模式,默认为’w’,覆盖已存在的文件;若设为’a’,则追加数据到已存在的文件。
      • encoding:指定文件编码。

    🐇数据过滤:pandas.DataFrame.loc

    Pandas.DataFrame.loc函数用法大全

    DataFrame.loc[row_indexer, column_indexer]:其中 ​row_indexer​和 ​column_indexer​可以是单个标签、标签列表、标签切片、布尔数组或可返回这些对象之一的可调用函数。

    • 通过标签选择特定行和列
      # 选择行为'Alice',列为'Age'和'City'
      df.loc['Alice', ['Age', 'City']]
      
      # 选择标签为'Alice'到'Charlie'的行,所有列
      df.loc['Alice':'Charlie', :]
      
      # 选择标签为'Alice'到'Charlie'的行,列为'Age'到'City'
      df.loc['Alice':'Charlie', 'Age':'City']
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • 使用布尔条件选择行和列
      # 选择年龄大于等于30的行,所有列
      df.loc[df['Age'] >= 30, :]
      
      # 选择年龄大于等于30的行,列为'Name'和'Age'
      df.loc[df['Age'] >= 30, ['Name', 'Age']]
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 使用可调用函数选择行和列
      # 定义一个函数,选择名字长度大于5的行,所有列
      def name_length(row):
          return len(row['Name']) > 5
          
      df.loc[name_length, :]
      
      • 1
      • 2
      • 3
      • 4
      • 5

    🐇抽样:pandas.DataFrame.sample

    【很详细的一篇博客!】Pandas数据清洗系列:DataFrame.sample方法详解

    DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)

    • n:要抽样的行数。
    • frac:要抽样的行百分比。
    • replace:是否允许重复抽样,默认为False。
    • weights:每行的抽样权重,可以是一个列名或值的Series。
    • random_state:用于确定随机种子的整数或RandomState对象,以确保可重复的随机抽样。
    • axis:0表示抽样行,1表示抽样列。
    # 从DataFrame中随机选择3行
    df.sample(n=3)
    
    # 从DataFrame中随机选择20%的行
    df.sample(frac=0.2)
    
    # 从DataFrame中选取3行,并允许重复抽样
    df.sample(n=3, replace=True)
    
    # 为每行设置不同的抽样权重,并从DataFrame中随机选择1行
    weights = pd.Series([0.1, 0.3, 0.6], index=df.index)
    df.sample(n=1, weights=weights)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    🐇删除缺失数据:dropha

    Pandas删除缺失数据函数–dropna
    DataFrame.dropna(axis=0, how='any', inplace=False)

    • ​​axis​:指定删除的轴,​axis=0​表示删除包含缺失值的行(默认),​axis=1​表示删除包含缺失值的列。
    • ​​ how​:指定删除的条件,默认为’any’,表示如果有任何一个元素为空,则删除该行或列;如果设置为’all’,则要求整行或整列都为空时才删除。
    • inplace​:指定是否在原地更改DataFrame,默认为 ​False​,表示创建一个新的DataFrame返回,不影响原始DataFrame。

    🐇添加元素:append

    Python 列表 append()函数使用详解

    DataFrame.append(other, ignore_index=False, verify_integrity=False)

    • other​:要追加的对象,可以是DataFrame、Series、字典(由Series组成)等。
    • ignore_index​:是否忽略索引,默认为 ​False​。如果设置为 ​True​,则添加行时会生成新的连续整数索引。
    • ​verify_integrity​:是否验证DataFrame中的索引,并引发异常,默认为 ​False​。如果设置为 ​True​,并且追加操作会导致索引冲突,则会引发异常。

    🐇groupby和匿名函数

    python——当groupby遇到匿名函数
    DataFrame.groupby(by=None, axis=0, level=None, as_index=True)

    • by​:指定用于分组的列或多个列,可以是列名、列标签列表或字典等。
    • axis​:指定分组的轴,默认为0,表示按行进行分组;设置为1则按列进行分组。
    • level​:对于具有多层级索引的数据,通过指定 ​level​可以按指定层级的索引进行分组,默认为 ​None​。
    • ​​as_index​:指定是否将分组的列作为新索引,默认为 ​True​,即将分组的列作为索引;设置为 ​False​则不进行该操作。

    grouped_data = df.groupby('category')['price'].apply(lambda x: x.mean())

    • 首先使用 ​groupby(‘category’)​对DataFrame ​df​ 按’category’列进行分组。
    • 对分组后的每个组使用 ​apply()​函数,将匿名函数应用于’price’列上。
    • 用匿名函数 ​lambda x: x.mean()​计算每个组中’price’列的均值。
    • 最终,得到一个包含每个分类的平均价格的Series对象。

    • reset_index(drop=True, inplace=True)​是对DataFrame对象进行操作的一个方法。它的主要作用是重置索引并将索引设置为连续的整数,并可选择是否在原地更改DataFrame。

    • 由于某些操作(例如分组、筛选、采样等)可能会导致DataFrame的索引出现乱序或不连续的情况,​reset_index()​可以帮助我们重新构建索引,确保其按照连续的整数值排列。

    • 假设有以下DataFrame

         index   A    B
      0      0   1  4.0
      1      2   2  5.0
      2      3   3  6.0
      
      • 1
      • 2
      • 3
      • 4
    • 执行后为

         A    B
      0  1  4.0
      1  2  5.0
      2  3  6.0
      
      • 1
      • 2
      • 3
      • 4

    📚案例

    • 过滤条件为:
      • from_level = “一般节点”
      • traffic !=0

    • 加权采样:to_level的值为一般节点与网络核心的权重之比为 1 : 5

    • 分层采样:根据to_level的值进行分层采样

    • 随机采样,以上各采样50条

      import pandas as pd
      
      # 读取数据集
      data = pd.read_csv('test.csv')
      
      # 删除空行(所有列均为空)
      data.dropna(how='all', inplace=True)
      
      # 数据过滤,只保留了'from_level'列值为"一般节点"且'traffic'列值不等于0的行
      filtered_df = data.loc[(data['from_level'] == "一般节点") & (data['traffic'] != 0)]
      filtered_df.to_csv('filtered_data.csv', index=False, encoding='utf-8')
      
      # 加权采样,一般节点被赋予1的权重,网络核心被赋予5的权重
      weighted_ratios = {'一般节点': 1, '网络核心': 5}
      sample_data = pd.DataFrame()
      for level, ratio in weighted_ratios.items():
          level_data = data[data['to_level'] == level]
          level_sample = level_data.sample(int(50 * ratio / sum(weighted_ratios.values())), random_state=42)
          sample_data = sample_data.append(level_sample)
      sample_data.to_csv('weighted_sample.csv', index=False, encoding='utf-8')
      
      # 分层采样,采样数量根据每个分组的数量与整个数据集的比例计算得出
      stratified_sample = data.groupby('to_level').apply(lambda x: x.sample(n=round(50*len(x)/len(data)), replace=False, random_state=42))
      stratified_sample.reset_index(drop=True, inplace=True)
      stratified_sample.to_csv('stratified_sample.csv', index=False, encoding='utf-8')
      
      # 随机采样
      random_sample = data.sample(n=50, replace=False, random_state=42)
      random_sample.to_csv('random_sample.csv', index=False, encoding='utf-8')
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
  • 相关阅读:
    文献学习01_Attention Is All You Need_20221119
    Filter过滤器
    大三第十周学习笔记
    IT专业入门,高考假期预习指南
    基于QGIS进行二次开发的正确姿势
    Spring Boot 项目部署方案,打包 + Shell 脚本部署详解,稳的一批
    2022国际数维杯C题题解:利用大脑结构特征和认知行为特征诊断阿尔茨海默病
    Linux升级jdk8为jdk11
    二选一工作器引入的Verilog语法
    OTA升级常见错误码汇总-CSDN博客
  • 原文地址:https://blog.csdn.net/m0_63398413/article/details/133770498