首页 > 解决方案 > 保留特定列(标签)的比率对数据框进行切片

问题描述

我有以下数据框:

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

列中的比率1和分别为0.60.40label

我怎样才能以这样的方式对这个数据框进行切片,使得观察数量现在是总数的 30%(601),但比例label保持不变?例如:

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

与 ratio10inlabel仍然分别为0.60.4

我尝试了以下方法:df = df.groupby('label').apply(lambda x: x.sample(frac=0.3, random_state=1).reset_index(drop=True))。这使比率保持label不变。但是,它返回一个奇怪的索引格式:

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

标签: pythonpython-3.xpandas

解决方案


一种方法是groupby().head()

# number of sample per class
N = int(len(df)*0.2)//2

df.groupby('label').head(N)

如果你想随机抽样,你可以使用groupby().sample()pandas 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)

推荐阅读