python - 保留特定列(标签)的比率对数据框进行切片
问题描述
我有以下数据框:
var1 var2 label
0 ".." ".." 0
1 ".." ".." 0
2 ".." ".." 1
3 ".." ".." 0
...
601 ".." ".." 1
列中的比率1
和分别为0.6和0.4。0
label
我怎样才能以这样的方式对这个数据框进行切片,使得观察数量现在是总数的 30%(601),但比例label
保持不变?例如:
var1 var2 label
0 ".." ".." 1
1 ".." ".." 0
2 ".." ".." 0
3 ".." ".." 0
...
181 ".." ".." 0
与 ratio1
和0
inlabel
仍然分别为0.6和0.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
解决方案
一种方法是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)
推荐阅读
- c# - 验证器代码更改未反映在调试运行中,未命中断点
- android - 为什么我的 ArrayList 没有正确填充?
- tensorflow - TFLearn 无法正确加载带有形状的训练数据
- c++ - 当不存在这样的构造函数时,将类传递给构造函数。为什么它有效?
- angularjs - 带有 UI Bootstrap 的 AngularJS - 单击导航项时自动折叠菜单
- excel - 单个工作表中的多个 Worksheet_Changes
- c# - 无法将类型“System.DateTime”隐式转换为“LearnScan.LearnUser.NullableDateTime”
- c# - 如何设置 .gitignore 文件以在版本控制中排除 bin/obj 文件
- vba - 使用 ADO 从 Access VBA 中检索用户成员资格以执行 LDAP 查询
- c# - 如何从 Outlook 获得正确的别名?