jay*_*ant 2 python python-2.7 pandas
我有一个数据框,其中很少有具有分箱值的列。这些分箱值是使用选项生成的pd.cut()。列的数据类型由以下给出:
group_credit object
group_transaction object
dtype: object
Run Code Online (Sandbox Code Playgroud)
如上所示,有两列具有分箱值,为了方便起见,我已将它们转换为字符串。然后我尝试对几行进行子集化;
temp=fraud_data[fraud_data['group_transaction']=='[20,23)']
temp
Run Code Online (Sandbox Code Playgroud)
但我根本没有得到任何数据。该值存在于数据框中,如下所示:
fraud_data.head(4)
Run Code Online (Sandbox Code Playgroud)
此代码给出第一行,如下所示;
group_credit| group_transaction
[1500,2000) [20,23)
Run Code Online (Sandbox Code Playgroud)
我能否获得有关如何对已经转换为字符串的分箱值进行子集化的帮助?谢谢
不需要将它们转换为字符串;将它们保留为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
Run Code Online (Sandbox Code Playgroud)
在不设置索引的情况下,可以使用item in Interval列表理解来生成布尔掩码,它可以轻松扩展到在多个 Interval 列上进行选择:
df[[1.14123123 in x for x in df.my_bin]]
Run Code Online (Sandbox Code Playgroud)
由于您有多个间隔,您可以使用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
Run Code Online (Sandbox Code Playgroud)
我们返回相同的子集,并看到标签已排序(0 标签是具有最小值的间隔)。
或者,pandas._libs.interval.Intervals 具有类别代码,允许您保留间隔及其所有功能,但根据类别代码选择它们。与上面一样,您需要了解哪些代码选择哪些垃圾箱:
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]
Run Code Online (Sandbox Code Playgroud)