很多时候,我甚至不得不将连续的数据转换成分类的数据类型,因为它有助于我的统计分析。
当我对分类列应用布尔索引(值< 11)时,它们不会像预期的那样被切片:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
### MAKE TESTDATA
df = sns.load_dataset("fmri")
df["timepoint"] = pd.Categorical(df["timepoint"], ordered=True)
### PERFORM BOOLEAN SLICING
df = df.loc[df["timepoint"] < 11]
# df = df.where(df["timepoint"] < 11) # SAME RESULT
g = sns.catplot(data=df, y="signal", x="timepoint")这会产生不正确的情节。X轴仍然超过11,而数据点被正确地切分:

原因:
分类数据被切片,但是它的索引(“类别”)忽略了切片操作。熊猫似乎用这个指数来显示x轴。
>>> print(df.timepoint.cat.categories)
Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], dtype='int64')是什么让它发挥作用的:
在转换为分类之前执行切片会导致所需的行为。同样,将分类类型转换为数字类型,然后再转换为范畴类型也是如此。不过。我怀疑他们的意图是这样的。
问题:
是否有一种优雅的方法可以通过分类列删除“未使用”类别(而不来回更改数据类型)?
发布于 2022-09-11 13:17:50
熊猫有意保留“未使用”类别。你可以用
df["timepoint"] = df["timepoint"].cat.remove_unused_categories()https://stackoverflow.com/questions/73679590
复制相似问题