Pandas 类别比较
Pandas Categories comparison
我正在这里创建一个示例数据框。
df = pd.DataFrame( np.random.randn(10,2), columns=list('AB'))
A B
0 0.459759 0.152645
1 0.183613 0.756527
2 -1.836027 0.032433
3 0.264336 0.170171
4 -0.276347 0.208389
5 0.677709 0.725274
6 -0.547858 0.376683
7 -0.994759 -0.750373
8 0.556593 1.282167
9 -1.444533 0.589768
df['A_rank']= pd.qcut(df['A'],[0,0.25,0.5,0.75,1],duplicates="drop")
A B A_rank
0 0.459759 0.152645 (0.411, 0.678]
1 0.183613 0.756527 (-0.0464, 0.411]
2 -1.836027 0.032433 (-1.837, -0.883]
3 0.264336 0.170171 (-0.0464, 0.411]
4 -0.276347 0.208389 (-0.883, -0.0464]
5 0.677709 0.725274 (0.411, 0.678]
6 -0.547858 0.376683 (-0.883, -0.0464]
7 -0.994759 -0.750373 (-1.837, -0.883]
8 0.556593 1.282167 (0.411, 0.678]
9 -1.444533 0.589768 (-1.837, -0.883]
我想从上面创建一个新的数据框,如下所示,它基本上是基于 A_rank.
的子集
A B A_rank A_rank_open_low A_rank_closed_hi
0 0.459759 0.152645 (0.411, 0.678] 0.411 0.678
5 0.677709 0.725274 (0.411, 0.678] 0.411 0.678
8 0.556593 1.282167 (0.411, 0.678] 0.411 0.678
我不想通过 qcut 使用整数标签,但希望直接使用 qcut 输出本身的标签,但我无法与类别 (A_rank) 进行比较范围。由于我对这种数据类型缺乏了解,以下尝试失败了。
df2 = df[df['A_rank']=="(0.411, 0.678]"]
没有错误,但输出为:
Empty DataFrame
Columns: [A, B, A_rank]
Index: []
df2 = df[df['A_rank']== pd.Categorical("(0.411, 0.678]")]
TypeError: Categoricals can only be compared if 'categories' are the same. Categories are different lengths
df2 = df[str(df['A_rank'])=="(0.411, 0.678]"]
也给出了 Traceback
我在文档中搜索了分类索引和类别,但找不到太多内容。请帮帮我。
使用Interval
:
df2 = df[df['A_rank']== pd.Interval(0.411, 0.678)]
@jezrael,向您展示了如何正确执行此操作。我想向您展示如何 "investigate" 类似案例。
首先检查列数据类型:
In [8]: df.dtypes
Out[8]:
A float64
B float64
A_rank category
dtype: object
然后是细胞类型:
In [9]: df.iat[0, 2]
Out[9]: Interval(0.0809, 0.539, closed='right')
In [10]: type(df.iat[0, 2])
Out[10]: pandas._libs.interval.Interval
我正在这里创建一个示例数据框。
df = pd.DataFrame( np.random.randn(10,2), columns=list('AB'))
A B
0 0.459759 0.152645
1 0.183613 0.756527
2 -1.836027 0.032433
3 0.264336 0.170171
4 -0.276347 0.208389
5 0.677709 0.725274
6 -0.547858 0.376683
7 -0.994759 -0.750373
8 0.556593 1.282167
9 -1.444533 0.589768
df['A_rank']= pd.qcut(df['A'],[0,0.25,0.5,0.75,1],duplicates="drop")
A B A_rank
0 0.459759 0.152645 (0.411, 0.678]
1 0.183613 0.756527 (-0.0464, 0.411]
2 -1.836027 0.032433 (-1.837, -0.883]
3 0.264336 0.170171 (-0.0464, 0.411]
4 -0.276347 0.208389 (-0.883, -0.0464]
5 0.677709 0.725274 (0.411, 0.678]
6 -0.547858 0.376683 (-0.883, -0.0464]
7 -0.994759 -0.750373 (-1.837, -0.883]
8 0.556593 1.282167 (0.411, 0.678]
9 -1.444533 0.589768 (-1.837, -0.883]
我想从上面创建一个新的数据框,如下所示,它基本上是基于 A_rank.
的子集 A B A_rank A_rank_open_low A_rank_closed_hi
0 0.459759 0.152645 (0.411, 0.678] 0.411 0.678
5 0.677709 0.725274 (0.411, 0.678] 0.411 0.678
8 0.556593 1.282167 (0.411, 0.678] 0.411 0.678
我不想通过 qcut 使用整数标签,但希望直接使用 qcut 输出本身的标签,但我无法与类别 (A_rank) 进行比较范围。由于我对这种数据类型缺乏了解,以下尝试失败了。
df2 = df[df['A_rank']=="(0.411, 0.678]"]
没有错误,但输出为:
Empty DataFrame
Columns: [A, B, A_rank]
Index: []
df2 = df[df['A_rank']== pd.Categorical("(0.411, 0.678]")]
TypeError: Categoricals can only be compared if 'categories' are the same. Categories are different lengths
df2 = df[str(df['A_rank'])=="(0.411, 0.678]"]
也给出了 Traceback
我在文档中搜索了分类索引和类别,但找不到太多内容。请帮帮我。
使用Interval
:
df2 = df[df['A_rank']== pd.Interval(0.411, 0.678)]
@jezrael,向您展示了如何正确执行此操作。我想向您展示如何 "investigate" 类似案例。
首先检查列数据类型:
In [8]: df.dtypes
Out[8]:
A float64
B float64
A_rank category
dtype: object
然后是细胞类型:
In [9]: df.iat[0, 2]
Out[9]: Interval(0.0809, 0.539, closed='right')
In [10]: type(df.iat[0, 2])
Out[10]: pandas._libs.interval.Interval