我有以下数据帧:
var1 var2 label
0 ".." ".." 0
1 ".." ".." 0
2 ".." ".." 1
3 ".." ".." 0
...
601 ".." ".." 1
列label
中的比率1
和0
分别为0.6和0.4。
我如何才能以这样的方式对该数据帧进行切片,即观察次数现在占总数的30%(601(,但label
中的比率保持不变?例如:
var1 var2 label
0 ".." ".." 1
1 ".." ".." 0
2 ".." ".." 0
3 ".." ".." 0
...
181 ".." ".." 0
1
和0
在label
中的比值仍分别为0.6和0.4。
我尝试了以下内容:df = df.groupby('label').apply(lambda x: x.sample(frac=0.3, random_state=1).reset_index(drop=True))
。这使得CCD_ 9的比例实际上保持不变。然而,它返回一个奇怪的索引格式:
var1 var2 label
label
0 0 ".." ".." 0
1 ".." ".." 0
2 ".." ".." 0
3 ".." ".." 1
...
181 ".." ".." 1
一种方法是groupby().head()
:
# number of sample per class
N = int(len(df)*0.2)//2
df.groupby('label').head(N)
如果你想随机采样,你可以使用groupby().sample()
和熊猫1.1+:
df.groupby('label').sample(n=N)
或者您可以在groupby().head()
:之前对数据进行混洗
df.sample(frac=1).groupby('label').head(N)
更新如果您的意思是希望将标签的比率保持为0.6:0.4
,那么groupby().sample()
将使您接近原始比率:
df.groupby('label').sample(frac=0.2)