我有一个不是真正平衡的数据集。因此,我想删除特定范围内的值,以使在每个范围内只剩下比预定数字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])
的{{1}}(可以是任何指定的整数)。例如,第一行中的值cutoff = 1
位于间隔[0,2)(不包括2)中,第二行也包含该间隔中的值。因为截止值等于1,所以在此间隔中只能允许b的一个值。因此,第二行被删除(如果不按顺序删除这些行,而是确定性地删除行,那将是很好的选择),然后获得以下缩减的数据帧。
0
答案 0 :(得分: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