为了账号安全,请及时绑定邮箱和手机立即绑定

蟒蛇| 熊猫以多个间隔丢弃值

蟒蛇| 熊猫以多个间隔丢弃值

米脂 2021-10-26 13:30:03
我有一个并不真正平衡的数据集。因此,我想删除特定范围内的值,以便在每个范围内我只剩下比预先指定的数量更少的观察值cutoff。我为了进一步解释我的意思我将展示一个例子(b列中的值是浮点数)  a b0 1 01 7 02 9 53 3 94 5 6 我想在 b 列中搜索特定范围,例如ranges = np.array([0, 2, 4, 6, 8, 10])给定 a cutoff = 1(可以是任何指定的整数)。例如,0第一行中的值位于区间 [0,2)(不包括 2)中,第二行也包含来自该区间的值。因为截止值等于 1,所以在这个区间中只允许 b 的一个值。因此,第二行被删除(如果这些行不会被顺序删除,而是不确定地删除,那就太好了),我们获得了以下简化的数据帧。  a b0 1 02 9 53 3 94 5 6 
查看完整描述

1 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

您可以使用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


查看完整回答
反对 回复 2021-10-26
  • 1 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号