python - 使用带有 IntervalIndex 的 pandas.cut 后如何重命名类别?

标签 python pandas

我使用 pandas.cut 离散化了数据框中的一列由 IntervalIndex.from_tuples 创建的垃圾箱.

剪切按预期工作,但类别显示为我在 IntervalIndex 中指定的元组.有没有办法将类别重命名为不同的标签,例如(小、中、大)?

例子:

bins = pd.IntervalIndex.from_tuples([(0, 1), (2, 3), (4, 5)])
pd.cut([0, 0.5, 1.5, 2.5, 4.5], bins)

生成的类别将是:

[NaN, (0, 1], NaN, (2, 3], (4, 5]]
Categories (3, interval[int64]): [(0, 1] < (2, 3] < (4, 5]]

我正在尝试更改 [(0, 1] < (2, 3] < (4, 5]]变成类似 1, 2 ,3 的东西或 small, medium ,large .

遗憾的是,当使用 IntervalIndex 时,pd.cut 的标签参数参数被忽略。

谢谢!

更新:

感谢@SergeyBushmanov,我注意到这个问题仅在尝试更改数据框内的类别标签时存在(这正是我正在尝试做的)。更新示例:

In [1]: df = pd.DataFrame([0, 0.5, 1.5, 2.5, 4.5], columns = ['col1'])
In [2]: bins = pd.IntervalIndex.from_tuples([(0, 1), (2, 3), (4, 5)])
In [3]: df['col1'] = pd.cut(df['col1'], bins)
In [4]: df['col1'].categories = ['small','med','large']

In [5]: df['col1']

Out [5]:
0       NaN
1    (0, 1]
2       NaN
3    (2, 3]
4    (4, 5]
Name: col1, dtype: category
Categories (3, interval[int64]): [(0, 1] < (2, 3] < (4, 5]]

最佳答案

如果我们有一些数据:

bins = pd.IntervalIndex.from_tuples([(0, 1), (2, 3), (4, 5)])
x = pd.cut([0, 0.5, 1.5, 2.5, 4.5], bins)

您可以尝试重新分配类别,例如:

In [7]: x.categories = [1,2,3]

In [8]: x   
Out[8]: 
[NaN, 1, NaN, 2, 3]
Categories (3, int64): [1 < 2 < 3]

或:

In [9]: x.categories = ["small", "medium", "big"]                         

In [10]: x                                             
Out[10]: 
[NaN, small, NaN, medium, big]
Categories (3, object): [small < medium < big]

更新:

df = pd.DataFrame([0, 0.5, 1.5, 2.5, 4.5], columns = ['col1'])
bins = pd.IntervalIndex.from_tuples([(0, 1), (2, 3), (4, 5)])
x = pd.cut(df["col1"].to_list(),bins)
x.categories = [1,2,3]
df['col1'] = x
df.col1
0    NaN
1      1
2    NaN
3      2
4      3
Name: col1, dtype: category
Categories (3, int64): [1 < 2 < 3]

更新 2:

在较新版本的 pandas 中,不是使用 x.categories = [1, 2, 3] 重新分配类别,而是应该使用 x.cat.rename_categories:

labels = [1, 2, 3]
x.cat.rename_categories(labels, inplace=True)

labels 可以是任何类型,在任何情况下,创建 pd.IntervalIndex 时设置的原始分类顺序将被保留。

关于python - 使用带有 IntervalIndex 的 pandas.cut 后如何重命名类别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55204418/

相关文章:

python - pdb 中是否可能存在嵌套断点——如果不能,是什么阻止了它们?

python - PANDAS 合并行并保留列顺序

python - 根据组过滤 DataFrame 行

python - 按元素乘以 1D-numpy 数组(形状(k,1)或(k,))并使结果具有第一个的形状

python - 找到默认的本地Jupyter目录

python - 全新安装 Anaconda 会产生 Pip 错误

python - 如何对 pyspark 使用 one-hot 编码或 get_dummies 并将列表作为列中的值?

python - 如何计算客户状态变更次数

python - 将数据帧值合并到新数据帧

python - 如何通过重新排序 reshape numpy 数组?