Pandas 的分层抽样(附示例)


研究人员经常从人群中抽取样本,并利用样本中的数据得出关于整个人群的结论。

常用的抽样方法是分层随机抽样,将总体分为若干组,并从每个组中随机选择一定数量的成员纳入样本。

本教程介绍了在 Python 中执行分层随机抽样的两种方法。

示例 1:使用计数进行分层抽样

假设我们有以下 pandas DataFrame,其中包含来自 2 个不同球队的 8 名篮球运动员的数据:

 import pandas as pd

#createDataFrame
df = pd.DataFrame({'team': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
                   'position': ['G', 'G', 'F', 'G', 'F', 'F', 'C', 'C'],
                   'assists': [5, 7, 7, 8, 5, 7, 6, 9],
                   'rebounds': [11, 8, 10, 6, 6, 9, 6, 10]})

#view DataFrame
df

        team position assists rebounds
0 A G 5 11
1 A G 7 8
2 A F 7 10
3 A G 8 6
4 B F 5 6
5 B F 7 9
6 B C 6 6
7 B C 9 10

以下代码展示了如何通过从每支球队中随机选择 2 名球员纳入样本来执行分层随机抽样:

 df. groupby ('team', group_keys= False ). apply ( lambda x: x.sample (2))

        team position assists rebounds
0 A G 5 11
3 A G 8 6
6 B C 6 6
5 B F 7 9

请注意,分层样本中包含每支球队的两名球员。

示例 2:使用比例分层抽样

我们再次假设我们有以下 pandas DataFrame,其中包含来自 2 个不同球队的 8 名篮球运动员的数据:

 import pandas as pd

#createDataFrame
df = pd.DataFrame({'team': ['A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'],
                   'position': ['G', 'G', 'F', 'G', 'F', 'F', 'C', 'C'],
                   'assists': [5, 7, 7, 8, 5, 7, 6, 9],
                   'rebounds': [11, 8, 10, 6, 6, 9, 6, 10]})

#view DataFrame
df

        team position assists rebounds
0 A G 5 11
1 A G 7 8
2 A F 7 10
3 A G 8 6
4 B F 5 6
5 B F 7 9
6 B C 6 6
7 B C 9 10

请注意,DataFrame 中的 8 名玩家中有 6 名 (75%) 属于 A 队,8 名玩家中有 2 名 (25%) 属于 B 队。

以下代码展示了如何执行分层随机抽样,使每个球队样本中的球员比例与较大的 DataFrame 中每个球队的球员比例相匹配:

 import numpy as np

#define total sample size desired
N = 4

#perform stratified random sampling
df. groupby ('team', group_keys= False ). apply ( lambda x: x. sample (int(np. rint (N* len (x)/ len (df))))). sample (frac=1). reset_index (drop= True )

        team position assists rebounds
0 B F 7 9
1 B G 8 6
2 B C 6 6
3 A G 7 8

请注意,分层样本中 A 队球员的比例 (25%) 与较大 DataFrame 中 A 队球员的比例相匹配。

同样,分层样本中 B 队球员的比例 (75%) 与较大 DataFrame 中 B 队球员的比例相匹配。

其他资源

以下教程解释了如何使用 pandas 选择其他样本类型:

如何在 Pandas 中进行聚类抽样
如何对大熊猫进行系统采样

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注