python - pandas:将多个类别合并为一个

标签 python pandas numpy

假设我有类别,1 到 10,我想将 red 分配给值 3 到 5,将 green 分配给 1,6 和 7,以及 blue 到 2、8、9 和 10。

我该怎么做?如果我尝试

df.cat.rename_categories(['red','green','blue'])

我得到一个错误:ValueError: new categories need to have the same number of items than the old categories! 但是如果我把它放在

df.cat.rename_categories(['green','blue','red', 'red', 'red'
                        'green', 'green', 'blue', 'blue' 'blue'])

我会收到一条错误消息,提示存在重复值。

我能想到的唯一其他方法是编写一个 for 循环,它会遍历值的字典并替换它们。有没有更优雅的解决方法?

最佳答案

不确定是否优雅,但如果您将旧类别改为新类别,例如(注意添加的“紫色”):

>>> m = {"red": [3,4,5], "green": [1,6,7], "blue": [2,8,9,10], "purple": [11]}
>>> m2 = {v: k for k,vv in m.items() for v in vv}
>>> m2
{1: 'green', 2: 'blue', 3: 'red', 4: 'red', 5: 'red', 6: 'green', 
 7: 'green', 8: 'blue', 9: 'blue', 10: 'blue', 11: 'purple'}

您可以使用它来构建一个新的分类系列:

>>> df.cat.map(m2).astype("category", categories=set(m2.values()))
0    green
1     blue
2      red
3      red
4      red
5    green
6    green
7     blue
8     blue
9     blue
Name: cat, dtype: category
Categories (4, object): [green, purple, red, blue]

如果您确定所有分类值都是列中看到。但在这里,如果我们不这样做,我们就不会在生成的 Categorical 中看到 purple,因为它是根据它实际看到的类别构建的。

当然,如果您已经构建了列表['green','blue','red', etc.],那么直接使用它创建一个新的分类列同样简单,完全绕过这个映射。

关于python - pandas:将多个类别合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32262982/

相关文章:

python - 如何使用 python 将表中的数据从多行转变成只有 4 行

python - 按索引复制 numpy 数组的单个轴

python - 在numpy数组中查找最大元素的索引,不包括少数索引

python - 通过 python 将日期和时间更新到 MySQL

Python Pandas 循环字典键(元组)并绘制变量相互关系

python - 用 pandas 中的其他列子字符串替换子字符串

python - 在 Python 中使用 NumPy 打印格式

Python Ansible 评估任务的输出

python - 另一种移动 Canvas 对象的方法?

python - date_range 不接受我想要使用的变量?