python - 蟒蛇 | 熊猫以多个间隔丢弃值
问题描述
我有一个不太平衡的数据集。因此,我想删除特定范围内的值,以便在每个范围内我只剩下比预先指定的 number 更少的观察值cutoff
。
我为了进一步解释我的意思,我将展示一个示例(b 列中的值是浮点数)
a b
0 1 0
1 7 0
2 9 5
3 3 9
4 5 6
我想在 b 列中搜索特定范围,例如ranges = np.array([0, 2, 4, 6, 8, 10])
给定 a cutoff = 1
(可以是任何指定的整数)。例如0
,第一行中的值位于区间 [0,2)(不包括 2)中,第二行也包含该区间中的值。因为截止值等于 1,所以只允许 b 的一个值位于该区间内。因此,第二行被删除(如果这些行不被顺序删除,而是不确定地删除,那就太好了),我们获得了以下减少的数据帧。
a b
0 1 0
2 9 5
3 3 9
4 5 6
解决方案
您可以使用pd.cut
以便b
根据将值装箱ranges
,并删除那些是duplicated
:
ranges = np.array([0, 2, 4, 6, 8, 10])
df[~(pd.cut(df.b, ranges, include_lowest=True, right=False)).duplicated()]
a b
0 1 0
2 9 5
3 3 9
4 5 6
在哪里:
pd.cut(df.b, ranges, include_lowest=True, right=False)
0 [0, 2)
1 [0, 2)
2 [4, 6)
3 [8, 10)
4 [6, 8)
Name: b, dtype: category
更新
如果要使用允许的重复值的特定截止值,可以按返回的间隔分组并使用 [ ] 选择重复pd.cut
的第一个值,以便选择属于同一间隔的第一行。n
head
n
下面的数据框与您的数据框相同,但多了一行,因此功能更清晰:
print(df)
a b
0 1 0
1 7 0
2 7 0
3 9 5
4 3 9
5 5 6
cuttoff = 2
g = pd.cut(df.b, ranges, include_lowest=True, right=False)
df.groupby(g).head(cuttoff)
a b
0 1 0
1 7 0
3 9 5
4 3 9
5 5 6
推荐阅读
- c++ - C++中指针和引用的用法
- javascript - 在按钮单击时启动 gameReady 功能
- javascript - 是否可以使输入元素的占位符属性在输入值后保持不变
- javascript - Kuzzle:使用js sdk 7订阅时有时会收到未定义的_kuzzle_info是正常的
- python - 是否可以将神经结构化学习实现到多维序列到序列模型以及如何实现?
- python - 通过滑块更新图(python)
- angular - Angular 9 - 不允许下载。启动或实例化下载的框架是沙盒的,但未设置标志“允许下载”
- c# - 如何从电子表格文档中删除空行
- javascript - HTML5 粘贴事件不包含多个文件
- google-cloud-platform - 如何在没有相等条件的情况下编写 BigQuery 左连接