Pandas - 对不同比例的多个组进行抽样
Pandas - sample many groups with different proportions
我需要对每个组使用不同的比例按组对数据帧进行采样。我有 100 多个组,但为了简单起见,我的示例只有 3 个组。
假设我有这个数据框:
df2 = pd.DataFrame({'group_id': np.repeat(['A', 'B', 'C'], (40, 60, 20)),
'vals': np.random.randn(120)})
N = len(df2)
df2.groupby('group_id').count()
# vals
#group_id
#A 40
#B 60
#C 20
我想使用下面的数据框对 A、B 和 C 组进行抽样:
prop = pd.DataFrame({'A': {0.45},
'B': {0.55},
'C': {0.62}})
当我尝试采样时,出现错误:
grouped = df2.groupby('group_id')
x = grouped.apply(lambda x: x.sample(frac=props))
错误:NameError:全局名称 'props' 未定义
非常感谢任何帮助!
谢谢
我认为需要标量的 DataFrame 然后通过 x.name
:
查找
prop = pd.DataFrame({'A': [0.45],
'B': [0.55],
'C': [0.62]})
grouped = df2.groupby('group_id')
x = grouped.apply(lambda x: x.sample(frac=prop[x.name]))
print (x.head(20))
group_id vals
group_id
A 19 A 1.157552
37 A 0.086347
0 A -0.668129
8 A -0.345811
27 A -0.301085
14 A -0.325130
6 A 0.301966
15 A 1.944702
4 A 1.350509
1 A -0.498210
2 A 0.618576
31 A -0.274381
16 A 1.915676
25 A 0.136372
32 A 0.864837
9 A -0.315231
20 A -0.106208
34 A 1.324797
B 85 B -0.861647
55 B -0.079275
我需要对每个组使用不同的比例按组对数据帧进行采样。我有 100 多个组,但为了简单起见,我的示例只有 3 个组。 假设我有这个数据框:
df2 = pd.DataFrame({'group_id': np.repeat(['A', 'B', 'C'], (40, 60, 20)),
'vals': np.random.randn(120)})
N = len(df2)
df2.groupby('group_id').count()
# vals
#group_id
#A 40
#B 60
#C 20
我想使用下面的数据框对 A、B 和 C 组进行抽样:
prop = pd.DataFrame({'A': {0.45},
'B': {0.55},
'C': {0.62}})
当我尝试采样时,出现错误:
grouped = df2.groupby('group_id')
x = grouped.apply(lambda x: x.sample(frac=props))
错误:NameError:全局名称 'props' 未定义
非常感谢任何帮助! 谢谢
我认为需要标量的 DataFrame 然后通过 x.name
:
prop = pd.DataFrame({'A': [0.45],
'B': [0.55],
'C': [0.62]})
grouped = df2.groupby('group_id')
x = grouped.apply(lambda x: x.sample(frac=prop[x.name]))
print (x.head(20))
group_id vals
group_id
A 19 A 1.157552
37 A 0.086347
0 A -0.668129
8 A -0.345811
27 A -0.301085
14 A -0.325130
6 A 0.301966
15 A 1.944702
4 A 1.350509
1 A -0.498210
2 A 0.618576
31 A -0.274381
16 A 1.915676
25 A 0.136372
32 A 0.864837
9 A -0.315231
20 A -0.106208
34 A 1.324797
B 85 B -0.861647
55 B -0.079275