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)]