Pandas基于分类间隔进行过滤

6

我创建了一个数据框,并将其中一列划分为区间:

df_test = pd.DataFrame({'col': [0,1,2,3,4,5,6]})
df_test['cat']= pd.cut(df_test['col'],[-1.,0.,3.,10.])
df_test

        col     cat
    0   0   (-1.0, 0.0]
    1   1   (0.0, 3.0]
    2   2   (0.0, 3.0]
    3   3   (0.0, 3.0]
    4   4   (3.0, 10.0]
    5   5   (3.0, 10.0]
    6   6   (3.0, 10.0]

现在我想使用cat列来过滤这个数据框:
df_test[df_test['cat'] == pd.Interval(left=1., right=2.)]

    col     cat
1   1   (0.0, 3.0]
2   2   (0.0, 3.0]
3   3   (0.0, 3.0]

为什么使用(1., 2.]检查相等性会得到这个结果?我原本期望得到一个空结果,因为这个区间在数据框中不存在。

我应该使用不同的方法来过滤吗?

3个回答

2

如果需要进行精确匹配,可以使用hack解决方案-将两者都转换为字符串:

最初的回答

a = df_test[df_test['cat'].astype(str) == str(pd.Interval(left=1., right=2.))]

你可以使用apply方法:
a = df_test[df_test['cat'].apply(lambda x: x == pd.Interval(left=1., right=2.))]
print (a)
Empty DataFrame
Columns: [col, cat]
Index: []

最初的回答:这个实现是为了检查成员资格。关于此的更多信息,请参见这里

谢谢你的回答。为什么使用 apply 可以工作?与我尝试的有什么区别? - Istopopoki
@Istopopoki - 在我看来,这里的pandas开发人员决定测试区间中的所有值是否相等,或者这是一个错误。不确定。 - jezrael

0

列表推导式提供了您所期望的结果:

[i == pd.Interval(1,2) for i in df['cat']]

输出:

[False, False, False, False, False, False, False]

0

您的函数是有效的,语法意味着它现在过滤所有间隔在 (1,2) 中的内容,所以在您的情况下 0.0 到 3.0 有 1-2 在内,因此如果您尝试: df_test[df_test['cat'] == pd.Interval(left=10, right=20)] 则会得到一个空数据框。

如果您想要精确匹配,也许将区间拆分会更好?


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