Python 检查值是否在浮点范围的分类序列中

Python 检查值是否在浮点范围的分类序列中,python,pandas,dataframe,categories,Python,Pandas,Dataframe,Categories,我得到了以下数据帧: bucket value 0 (15016, 18003.2] 368 1 (12028.8, 15016] 132 2 (18003.2, 20990.4] 131 3 (9041.6, 12028.8] 116 4 (50.128, 3067.2] 82 5 (3067.2, 6054.4] 79 6 (6054.4, 9041.6] 54 7 (20990.4, 23

我得到了以下数据帧:

     bucket             value
0   (15016, 18003.2]    368
1   (12028.8, 15016]    132
2   (18003.2, 20990.4]  131
3   (9041.6, 12028.8]   116
4   (50.128, 3067.2]    82
5   (3067.2, 6054.4]    79
6   (6054.4, 9041.6]    54
7   (20990.4, 23977.6]  28
8   (23977.6, 26964.8]  8
9   (26964.8, 29952]    2
bucket
已使用
pd.cut()
命令计算(数据类型为
cateogray

我想检查一个值,比如说
my_value=20000
,是否在
bucket
的范围内

它可以返回一个包含多个列的数据帧:

     bucket             value   value_in_bucket
0   (15016, 18003.2]    368     FALSE
1   (12028.8, 15016]    132     FALSE
2   (18003.2, 20990.4]  131     TRUE
3   (9041.6, 12028.8]   116     FALSE
4   (50.128, 3067.2]    82      FALSE
5   (3067.2, 6054.4]    79      FALSE
6   (6054.4, 9041.6]    54      FALSE
7   (20990.4, 23977.6]  28      FALSE
8   (23977.6, 26964.8]  8       FALSE
9   (26964.8, 29952]    2       FALSE
主要的问题是,
bucket
的每一项都是一个字符串,因此我可以将该字符串分成两列,并使用基本测试和
apply
,但对我来说它似乎并不那么优雅。

您可以使用相同的存储箱应用
pd.cut()
(或者,更好的做法是,当您使用
value
列上的
retbins=True
参数创建
bucket
列时,将其保存为存储箱,并将其与
bucket
列进行比较

演示:

一步创建
bucket
列并保存仓位:

In [267]: df['bucket'], bins = pd.cut(df.a, bins=5, retbins=True)

In [268]: df
Out[268]:
    a        bucket
0   9   (8.2, 10.4]
1   6  (5.989, 8.2]
2  13  (12.6, 14.8]
3  11  (10.4, 12.6]
4  17    (14.8, 17]

In [269]: bins
Out[269]: array([  5.989,   8.2  ,  10.4  ,  12.6  ,  14.8  ,  17.   ])
生成要比较的新列:

In [270]: df['b'] = np.random.randint(10,12, 5)

In [271]: df
Out[271]:
    a        bucket   b
0   9   (8.2, 10.4]  10
1   6  (5.989, 8.2]  11
2  13  (12.6, 14.8]  11
3  11  (10.4, 12.6]  11
4  17    (14.8, 17]  11
比较是否有匹配项(使用保存的
存储箱
):


您还可以将
retbins=True
传递到第一次切割,并在第二次切割中使用。这也适用于单个值(
pd.cut([2000],bins)
返回值2000的类别).@ayhan,这是一个非常好的观点,谢谢!我会把它添加到答案中…对你的两个答案都很有吸引力,谢谢。@ayhan,顺便说一句,你能取消删除吗?我认为它完美地回答了这个问题?OP也想看看你的答案…@MaxU好的,我做了。OP问了另一个类似数据集的问题,所以我认为问题出在某个地方还有别的。
In [270]: df['b'] = np.random.randint(10,12, 5)

In [271]: df
Out[271]:
    a        bucket   b
0   9   (8.2, 10.4]  10
1   6  (5.989, 8.2]  11
2  13  (12.6, 14.8]  11
3  11  (10.4, 12.6]  11
4  17    (14.8, 17]  11
In [272]: pd.cut(df.b, bins=bins) == df.bucket
Out[272]:
0     True
1    False
2    False
3     True
4    False
dtype: bool