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 选择其他样本类型: