Python |熊猫在多个时间间隔内下降值

时间:2019-01-31 17:05:19

标签: python pandas reduction

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

1 个答案:

答案 0 :(得分:1)

您可以使用pd.cut以便根据branges中的值进行装箱,并删除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