Python之pandas的三种sample采样方法

Python之pandas的三种sample采样方法

可能只需要 Python dataframe的某些行。可以通过 不同的采样(Sample)技术 实现这一结果。

在本教程中,将通过 Python Pandas 执行行采样的以下技术:

  • 随机抽样
  • 有条件采样
  • 以恒定速率采样


加载数据集

在本教程中,我利用库 iris 提供的数据集 scikit-learn 并将其转换为 pandas 数据帧:

from sklearn.datasets import load_iris 
import pandas as pd数据 = load_iris() 
df = pd.DataFrame(data.data, columns=data.feature_names)

数据集由 4 列 150 行。

随机抽样

给定一个包含 N 行的dataframe,随机采样从dataframe中提取 X 随机行,其中 X ≤ N。Python pandas 提供了一个函数,命名 sample() 为执行随机采样。

要提取的样本数量可以用两种替代方式表示:

  • 指定要提取的随机行的确切数量
  • 指定要提取的随机行的百分比。百分比表示为 0 到 1 之间的数字。

确切数字

在这种情况下,可以将参数传递 n sample() 函数,如下所示:

subset = df.sample(n=100)

在前面的示例中,该 sample() 函数提取了 100 条随机行。您可以 subset 通过以下 shape 函数检查结果数据集的形状:

subset.shape

这给出了以下输出:

(100, 4)

百分比

如果要指定要提取的随机行的百分比,可以将 frac 参数作为 sample() 函数的输入传递:

subset = df.sample(frac=0.5)

在前面的示例中,该 sample() 函数提取了 50% 的随机行。请注意,您只能在 n frac 参数之间指定一个。

有条件采样

带条件采样允许仅提取满足给定条件的一些行。首先,必须指定条件。例如,作为条件,您可以只选择列值 sepal width (cm) 小于 3 的行:

condition = df['sepal width (cm)'] < 3

变量 condition 是一系列大小相同的 df ,包含 True/False ,取决于行是否满足条件。

然后,检索与满足上述条件的行相关联的索引:

true_index = condition[condition == True].index

在当前示例中,有 57 行满足条件,因此您最多可以采样 57 行。

sample() 函数可用于按如下条件进行采样:

subset = df[condition].sample(n = 10)

以恒定速率采样

另一种采样策略是以恒定速率采样,这意味着您希望两个相邻样本之间的距离恒定。例如,您可能希望以 4 的速率进行采样,如下图所示:

在这种情况下,您首先指定费率:

rate = 10

然后,您只需提取样本:

subset = df[::rate]

iris 数据集中,样本数为 150,因此采样率为 10 将生成具有 15 行的子集:

subset.shape

这给出了以下输出:

(15, 4)

获取数据集的剩余部分

提取数据集的子集后,还可以提取剩余部分。例如,如果您想在不使用库 train_test_split() 提供的函数的情况下拆分训练集和测试集中的数据集,则可以使用此策略 scikit-learn

可以采用两种可能的解决方案来提取数据集的剩余部分。两种解决方案产生相同的结果。

第一个解决方案

第一种解决方案将提取的数据帧 ( subset )的行删除到原始数据帧中 df ,并将结果存储在新的数据帧中。这可以通过将要删除的索引列表传递给 drop() 函数来实现:

remaining = df.drop(labels=subset.index)

第二种解决方案

第二种解决方案仅选择原始数据帧中的行, df 其中索引不在提取的数据帧的索引列表中 subset

remaining = df[~df.index.isin(subset.index)]
发布于 2021-07-08 01:11

文章被以下专栏收录