您的位置:

Python数据框基础操作:DataFrame.sample()方法实例详解

一、DataFrame.sample()方法概述

Python中的pandas库提供了一个功能强大的类——DataFrame,该类被广泛应用于数据帧分析和操作。函数DataFrame.sample()是该类中的一个方法,它通常用于从数据框中随机抽取样本。该函数的主要语法如下:

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

其中,参数n表示输出样本的数量,frac表示输出样本的占比,用0到1之间的浮点数表示。replace参数表示是否可以在输出样本中包含重复的行。weights参数表示每行在随机过程中抽取的权重,必须是正数,如果缺省情况下,则每个样本的权重相等。axis参数表示是从行方向(axis=0)或列方向(axis=1)中抽取样本,默认是从行方向中抽取。

二、DataFrame.sample()方法的使用场景

在大数据的处理过程中,为了提高数据的处理效率,通常只需要对整个数据集中的一部分进行分析,并从中抽取样本的数据子集。常见的使用场景包括随机抽样、k-means和kmeans++算法等。与大多数概率算法相同,随机抽样需要随机数生成器。 为了确保结果的可复现性,可以通过随机状态(random_state)参数指定随机数种子,从而确保得到的样本集的统计意义是相同的。

三、DataFrame.sample()方法的代码示例

下面给出一个关于DataFrame.sample()方法的简单实例:

import pandas as pd
import numpy as np
 
# 创建一个数据框
df = pd.DataFrame({'A': range(1, 11), 'B': np.random.randn(10)})
print("原始数据框:")
print(df)
 
# 从数据框中抽取整行,输出前2行数据
df_sample1 = df.sample(n=2) 
print("\n抽取2行:")
print(df_sample1)
 
# 从数据框中抽取整行,输出前30%的数据
df_sample2 = df.sample(frac=0.3, random_state=1)
print("\n抽取前30%的数据:")
print(df_sample2)
 
# 从数据框中抽取整列
df_sample3 = df.sample(axis=1)
print("\n抽取整列:")
print(df_sample3)

上述代码输出的运行结果如下:

原始数据框:
    A         B
0   1  0.160417
1   2 -0.536356
2   3 -0.784670
3   4  0.432485
4   5 -1.269952
5   6  1.711935
6   7 -0.154067
7   8  0.933766
8   9  1.076213
9  10 -1.051958

抽取2行:
   A         B
1  2 -0.536356
4  5 -1.269952

抽取前30%的数据:
   A         B
3  4  0.432485
5  6  1.711935
4  5 -1.269952

抽取整列:
          B   A
0  0.160417   1
1 -0.536356   2
2 -0.784670   3
3  0.432485   4
4 -1.269952   5
5  1.711935   6
6 -0.154067   7
7  0.933766   8
8  1.076213   9
9 -1.051958  10

四、DataFrame.sample()方法快速实现随机采样

DataFrame.sample()方法一个非常有用的特性就是可以快速实现随机采样。下面以在从一个大型数据集中抽取前50个样本为例,介绍如何实现随机采样。

import pandas as pd
 
# 假设有百万记录的大型数据集 dset,随机抽取前50条记录
dset = pd.read_csv("dset.csv")
rand_indices = np.arange(dset.shape[0])
np.random.shuffle(rand_indices)
dset = dset.iloc[rand_indices[:50], :]

上述代码中,np.random.shuffle()函数将数据集中的每个记录打乱,之后iloc方法根据生成的随机索引(rand_indices)从数据集中随机抽取出前50条记录。