Python 以特定列(标签)的比率切片数据帧

Python 以特定列(标签)的比率切片数据帧,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有以下数据框: var1 var2 label 0 ".." ".." 0 1 ".." ".." 0 2 ".."

我有以下数据框:

      var1                  var2                       label
 0    ".."                  ".."                        0
 1    ".."                  ".."                        0
 2    ".."                  ".."                        1
 3    ".."                  ".."                        0
 ...
 601  ".."                  ".."                        1
标签
列中的比率
1
0
分别为0.60.4

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

      var1                  var2                       label
 0    ".."                  ".."                        1
 1    ".."                  ".."                        0
 2    ".."                  ".."                        0
 3    ".."                  ".."                        0
 ...
 181  ".."                  ".."                        0
label
中的比率
1
0
仍分别为0.60.4

我尝试了以下操作:
df=df.groupby('label')。应用(lambda x:x.sample(frac=0.3,random\u state=1)。重置索引(drop=True))
。这使
标签
的比率保持不变。但是,它返回一种奇怪的索引格式:

             var1                      var2                       label
label               
0       0    ".."                      ".."                        0
        1    ".."                      ".."                        0
        2    ".."                      ".."                        0
        3    ".."                      ".."                        1
...
        181  ".."                      ".."                        1
一种方法是
groupby().head()

如果要随机采样,可以使用熊猫1.1+的
groupby().sample()

df.groupby('label').sample(n=N)
或者您可以在
groupby().head()之前洗牌数据:


更新如果您的意思是希望将标签的比率保持为
0.6:0.4
,则
groupby().sample()
将使您接近原始比率:

df.groupby('label').sample(frac=0.2)

接近。检查这篇文章的更新。@jxpython move
reset\u index(drop=True)
groupby().apply()之外。你是对的。谢谢你的修复!标签现在已订购。它们首先以0开头。您对此有何解释?请在删除之前尝试
sort_index
(df.groupby('label')。应用(lambda x:x.sample(frac=0.3))。排序_index(level=1)。重置_index(drop=True))
df.sample(frac=1).groupby('label').head(N)
df.groupby('label').sample(frac=0.2)