在 pandas
中,如果遇到数据量特别大的情况,随机挑选 DataFrame 的子集可以帮助我们更深入地了解数据,从而更好地进行数据分析和决策。
随机挑选子集的用途主要有:
本篇介绍一种pandas
挑选子集的方式,以及子集在机器学习中常用的一个场景。
这次示例中准备的数据来自链家网,我采集了一些南京市建邺区的房产交易数据,共有11290条。
import pandas as pd
fp = "nanjing-jianye.csv"
df = pd.read_csv(fp)
df
按百分比随机挑选样本的核心参数是 frac
和 random_state
。
df1 = df.sample(frac=0.1, random_state=1111)
df1.sort_index()
上面的示例中 frac=0.1
,相当于获取总量10%
的样本,总量11290
条,所以样本数量1129
条。
示例中的random_state=1111
,只要改变这个数值,取出的样本就是会变化。
df1 = df.sample(frac=0.1, random_state=2222)
df1.sort_index()
按个数随机挑选样本的核心参数是 n
和 random_state
。
df2 = df.sample(n=100, random_state=1111)
df2.sort_index()
上面的示例中n=100
,随机取100
个样本,其中random_state
的作用和按百分比挑选一样。
随机挑选子集的用途开头已经介绍了很多,还有个重要的应用场景是在机器学习时,可以将数据划分为训练集和测试集。
针对这个需求,利用上面介绍的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)
ds
ds
列表中就是平均划分的10
个子集。
应用机器学习的算法时,可以循环任意选择7
个作为训练集,剩余3
个作为测试集。
本篇中使用的数据下载地址:nanjing-jianye.csv