首页 > 解决方案 > 蟒蛇 | 熊猫以多个间隔丢弃值

问题描述

我有一个不太平衡的数据集。因此,我想删除特定范围内的值,以便在每个范围内我只剩下比预先指定的 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 

标签: pythonpandasreduction

解决方案


您可以使用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的第一个值,以便选择属于同一间隔的第一行。nheadn

下面的数据框与您的数据框相同,但多了一行,因此功能更清晰:

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

推荐阅读