铁佛 发表于 2023-7-26 11:54:39

【pandas小技巧】--随机挑选子集

在 pandas 中,如果遇到数据量特别大的情况,随机挑选 DataFrame 的子集可以帮助我们更深入地了解数据,从而更好地进行数据分析和决策。
随机挑选子集的用途主要有:

[*]评估数据质量:随机挑选 DataFrame 的子集可以帮助我们检查数据集的质量,以便进一步探索和挖掘数据。例如,我们可以通过随机选择一些行或列来评估数据的分布、离群值、缺失值等情况。
[*]加深理解数据:随机挑选 DataFrame 的子集可以帮助我们更深入地了解数据。例如,我们可以通过随机选择一些列来了解数据的分布、趋势、相关性等情况。
[*]发现潜在模式:随机挑选 DataFrame 的子集可以帮助我们发现潜在的模式或规律。例如,我们可以通过随机选择一些行或列来探索数据之间的相关性或趋势,从而发现潜在的模式或规律。
[*]探索新的数据分析方法:随机挑选 DataFrame 的子集可以帮助我们探索新的数据分析方法。例如,我们可以通过随机选择一些列来探索新的数据分析方法,如时间序列分析、空间分析等。
[*]提高程序性能:随机挑选 DataFrame 的子集可以帮助我们优化程序性能。例如,我们可以通过随机选择一些列来减少计算量,从而提高程序性能。
本篇介绍一种pandas挑选子集的方式,以及子集在机器学习中常用的一个场景。
1. 随机挑选

这次示例中准备的数据来自链家网,我采集了一些南京市建邺区的房产交易数据,共有11290条。
import pandas as pd

fp = "nanjing-jianye.csv"
df = pd.read_csv(fp)
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683535138049-a7763c40-4372-46c4-b2dc-c752bc56f30b.png#averageHue=%23e5e4e4&clientId=u047ad231-653a-4&from=paste&height=409&id=u1bccff0a&originHeight=409&originWidth=420&originalType=binary&ratio=1&rotation=0&showTitle=false&size=35948&status=done&style=none&taskId=u9c91e4cc-4d61-4da7-b6c5-bc8f075c47b&title=&width=420
1.1. 按百分比挑选

按百分比随机挑选样本的核心参数是 frac 和 random_state。

[*]frac:样本数量占总量的百分比
[*]random_state:随机状态,这个值相同,取出的样本是一样的
df1 = df.sample(frac=0.1, random_state=1111)
df1.sort_index()https://cdn.nlark.com/yuque/0/2023/png/2235414/1683535874952-a8496cc0-10fd-4068-b7a4-449f5f69c816.png#averageHue=%23e6e5e5&clientId=u047ad231-653a-4&from=paste&height=411&id=uaa95b391&originHeight=411&originWidth=435&originalType=binary&ratio=1&rotation=0&showTitle=false&size=35668&status=done&style=none&taskId=ucb44e19a-1975-4436-9581-09a7d8711f5&title=&width=435
上面的示例中 frac=0.1,相当于获取总量10%的样本,总量11290条,所以样本数量1129条。
示例中的random_state=1111,只要改变这个数值,取出的样本就是会变化。
df1 = df.sample(frac=0.1, random_state=2222)
df1.sort_index()https://cdn.nlark.com/yuque/0/2023/png/2235414/1683536405595-8eb5f8ba-1c62-4959-bb42-bd40a51913c9.png#averageHue=%23e5e4e4&clientId=u047ad231-653a-4&from=paste&height=397&id=u91bddea3&originHeight=397&originWidth=417&originalType=binary&ratio=1&rotation=0&showTitle=false&size=36224&status=done&style=none&taskId=uc5dcdcdd-e7b2-4564-ba9c-b4089401b9f&title=&width=417
1.2. 按个数挑选

按个数随机挑选样本的核心参数是 n 和 random_state。

[*]n:样本数量
[*]random_state:随机状态,这个值相同,取出的样本是一样的
df2 = df.sample(n=100, random_state=1111)
df2.sort_index()https://cdn.nlark.com/yuque/0/2023/png/2235414/1683536552481-f21cc71c-7030-4212-814c-7863f7e5dfd5.png#averageHue=%23e5e4e4&clientId=u047ad231-653a-4&from=paste&height=406&id=ucc173c38&originHeight=406&originWidth=411&originalType=binary&ratio=1&rotation=0&showTitle=false&size=35625&status=done&style=none&taskId=u99f89913-79c4-4050-a097-6551ef5a44b&title=&width=411
上面的示例中n=100,随机取100个样本,其中random_state的作用和按百分比挑选一样。
2. 机器学习中使用场景

随机挑选子集的用途开头已经介绍了很多,还有个重要的应用场景是在机器学习时,可以将数据划分为训练集和测试集。
针对这个需求,利用上面介绍的sample函数封装一个平均划分的子集接口。
用于机器学习时分隔训练集和测试集。
import pandas as pd
import random

def split_dataset(df: pd.DataFrame, n = 10):
    """
    df: 带划分的数据集
    n: 划分子集的个数,默认10个
    """
    total = len(df)
    subset_count = total // n

    dataset = []
    df_left = df.copy()
    for i in range(n):
      df_subset = df_left.sample(n=subset_count, random_state=random.randint(1000,9999))
      dataset.append(df_subset.copy())

      df_left = df_left.drop(index=df_subset.index)

    return dataset比如上面示例的房产成交数据(共11290条),通过此方法可以平均划分成n个数据集。
ds = split_dataset(df, n=10)
dshttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683555442628-517ae90a-54b2-4c5e-9d43-95dff04ba2cd.png#averageHue=%23e6e6e6&clientId=udbbbef18-9be3-4&from=paste&height=693&id=ua9f5f9ec&originHeight=693&originWidth=528&originalType=binary&ratio=1&rotation=0&showTitle=false&size=137978&status=done&style=none&taskId=u74c66177-7073-45f1-95be-d2493429d25&title=&width=528
ds列表中就是平均划分的10个子集。
应用机器学习的算法时,可以循环任意选择7个作为训练集,剩余3个作为测试集。
3. 附录

本篇中使用的数据下载地址:nanjing-jianye.csv

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【pandas小技巧】--随机挑选子集