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

文章目录

  • 相关函数
    • 数据读取和写入:read_csv和to_csv
    • 数据过滤:pandas.DataFrame.loc
    • 抽样:pandas.DataFrame.sample
    • 删除缺失数据:dropha
    • 添加元素:append
    • groupby和匿名函数
  • 案例


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']
    
  • 使用布尔条件选择行和列
    # 选择年龄大于等于30的行,所有列
    df.loc[df['Age'] >= 30, :]
    
    # 选择年龄大于等于30的行,列为'Name'和'Age'
    df.loc[df['Age'] >= 30, ['Name', 'Age']]
    
  • 使用可调用函数选择行和列
    # 定义一个函数,选择名字长度大于5的行,所有列
    def name_length(row):
        return len(row['Name']) > 5
        
    df.loc[name_length, :]
    

抽样: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)

删除缺失数据: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
    
  • 执行后为

       A    B
    0  1  4.0
    1  2  5.0
    2  3  6.0
    

案例

  • 过滤条件为:
    • 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')
    

你可能感兴趣的:(#,大数据分析实践,大数据与数据分析,数据分析,数据挖掘)