选择熊猫中的绑定值

时间:2019-05-11 16:49:58

标签: python pandas python-2.7

我有一个数据框,只有很少几列具有合并值。这些合并值是使用pd.cut()选项制成的。列的数据类型由;

给出
group_credit                                  object
group_transaction                             object
 dtype: object

如上所示,有两列具有合并值,为方便起见,我将它们转换为字符串。然后我试图将几行子集化;

temp=fraud_data[fraud_data['group_transaction']=='[20,23)']
temp

但是我什么也没得到。该值出现在数据框中,如下所示:

fraud_data.head(4)

此代码给出了第一行,如下所示:

group_credit| group_transaction
[1500,2000)    [20,23)

我能在如何将已转换为字符串的合并值的子集上获得帮助吗?

1 个答案:

答案 0 :(得分:1)

无需将它们转换为字符串;将其保留为category

只有一个Interval时,将其设置为索引通常很有意义。然后,您可以使用.loc通过选择该间隔内的任何值来对间隔进行切片:

import pandas as pd
import numpy as np

np.random.seed(12)
df = pd.DataFrame({'data': np.random.randint(1,10,15)})
df['my_bin'] = pd.cut(df.data, bins=3)

                           # Could use anything within the bin.
df.set_index('my_bin').loc[1.14123123]
#                data
#my_bin              
#(0.992, 3.667]     2
#(0.992, 3.667]     3
#(0.992, 3.667]     1
#(0.992, 3.667]     2
#(0.992, 3.667]     3
#(0.992, 3.667]     1

无需设置索引,就可以结合列表理解使用item in Interval来生成布尔掩码,该布尔掩码可以很容易地扩展到在多个Interval列上进行选择:

df[[1.14123123 in x for x in df.my_bin]]

由于您有多个时间间隔,因此可以使用label。如果您愿意,这是有道理的,因此您的标签应为整数0-9。您可以提供自己的标签,也可以使用False返回整数标签。 (在这里,我将两个类别标签都留在图中以供说明,但实际上,您只需要一个。)

df['my_bin2'] = pd.cut(df.data, bins=3, labels=False)
df[df.my_bin2 == 0]
#    data          my_bin  my_bin2
#1      2  (0.992, 3.667]        0
#2      3  (0.992, 3.667]        0
#5      1  (0.992, 3.667]        0
#7      2  (0.992, 3.667]        0
#10     3  (0.992, 3.667]        0
#12     1  (0.992, 3.667]        0

我们返回相同的子集,并看到标签已排序(0标签是具有最小值的时间间隔)。

或者,pandas._libs.interval.Interval具有类别代码,使您可以保留时间间隔及其所有功能,但可以根据类别代码进行选择。与上述类似,您需要了解哪些代码选择哪些垃圾箱:

df[df.my_bin.cat.codes == 0]
#    data          my_bin
#1      2  (0.992, 3.667]
#2      3  (0.992, 3.667]
#5      1  (0.992, 3.667]
#7      2  (0.992, 3.667]
#10     3  (0.992, 3.667]
#12     1  (0.992, 3.667]