使用保留的特定列(标签)的比率对数据帧进行切片



我有以下数据帧:

var1                  var2                       label
0    ".."                  ".."                        0
1    ".."                  ".."                        0
2    ".."                  ".."                        1
3    ".."                  ".."                        0
...
601  ".."                  ".."                        1

label中的比率10分别为0.60.4

我如何才能以这样的方式对该数据帧进行切片,即观察次数现在占总数的30%(601(,但label中的比率保持不变?例如:

var1                  var2                       label
0    ".."                  ".."                        1
1    ".."                  ".."                        0
2    ".."                  ".."                        0
3    ".."                  ".."                        0
...
181  ".."                  ".."                        0

10label中的比值仍分别为0.60.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)

最新更新