我有一个数据框,只有很少几列具有合并值。这些合并值是使用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)
我能在如何将已转换为字符串的合并值的子集上获得帮助吗?
答案 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]