数据框按照区间数据类型过滤一列

4

我有一个数据框数组,其中包含一些列,其中之一是“时间”。 我想筛选时间在特定区间内的行。

为了简化问题,我创建了一个具有整数值和整数区间的数据框。

data=pd.DataFrame({'A':[1,2,3,4,5,6,7,8,9]})
interval=pd.Interval(1,4)
data[data['A'] in interval]

显示: ValueError:Series的真值是不明确的。请使用a.empty,a.bool(),a.item(),a.any()或a.all()。 但期望结果是[2,3,4]。

目前在pandas中没有内置的方法来实现这一点,但这是将来会添加的内容(尚无明确的时间表)。 - root
3个回答

8

between

pandas.Series.between函数返回一个布尔型掩码,可用于过滤数据框。

data[data.A.between(1, 4)]

   A
0  1
1  2
2  3
3  4

查询

pandas.DataFrame.query 可以用于过滤数据。

data.query('1 <= A <= 4')

   A
0  1
1  2
2  3
3  4

isin

pandas.Series.isin 可以在特殊的整数情况下使用 range。类似于 between,我们创建一个布尔掩码。

data[data.A.isin(range(1, 5))]

   A
0  1
1  2
2  3
3  4

谢谢,但是有没有可能在函数中使用间隔? - Ali
据我所知,pandas.Interval旨在表示可哈希的事物,可以表示类别。它用于将数据分成表示为间隔的桶中。然后,我们可以使用这些间隔作为索引。当然,Pandas开发人员可以更改它以适应此类事情,但我怀疑他们会这样做。 - piRSquared
你认为 data[data.A.apply(lambda x : x in interval)] 这种方式怎么样? - Ali
考虑到“apply”函数,这种方法虽然聪明但速度较慢。更简洁的方式是使用以下代码,但不建议使用:data[data.A.map(interval.__contains__)]data[[*map(interval.__contains__, data.A)]] - piRSquared
1
因此,在一般情况下,“between”和“isin”的示例并不完全正确:“between”不能处理混合不等式(即在该示例中,区间在右侧是开放的,在左侧是封闭的),而“isin”示例不能处理分数值(即1.5在示例区间内)。 - root
@root 我同意关于isin的观点,但如果我们只处理整数,则在选择适当的限制时将是正确的。对于between,您可以使用选项inclusive=Trueinclusive=False选择边界是否包含,但无论哪种情况,您都不会得到混合包含...所以我也同意您的看法。query优雅地处理它,其余的就留给其他人了(-: - piRSquared

4
使用你的interval
data.loc[(data.A>=interval.left) & (data.A<interval.right)]
Out[245]: 
   A
0  1
1  2
2  3
3  4

2
使用 Series.between 函数:
s = data[data.A.between(interval.left+1, interval.right)]

print(s)
   A
1  2
2  3
3  4

或者使用布尔索引

最初的回答。

l = data[(data.A > interval.left) & (data.A <= interval.right)]

print(l)
   A
1  2
2  3
3  4

1
谢谢,但是有没有可能在函数中使用间隔? - Ali
“between” 在一般情况下并不适用,因为它不能处理混合不等式(例如,在该示例中,区间在右侧是开放的,在左侧是封闭的);将1添加到开放端点无法考虑到分数值(即1.1在示例区间内)。 - root

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接