获取pandas中分类变量的映射

时间:2015-05-28 15:13:58

标签: python pandas

我这样做是为了制作分类变量数字

>>> df = pd.DataFrame({'x':['good', 'bad', 'good', 'great']}, dtype='category')

       x
0   good
1    bad
2   good
3  great

如何获取原始值和新值之间的映射?

3 个答案:

答案 0 :(得分:41)

方法1

您可以通过枚举创建字典映射(类似于通过从列表索引创建字典键从列表创建字典):

using System.Xml.Linq;
...
XDocument doc = XDocument.Load(reader);
var responseString = doc.Descendants("output").First().Value;

方法2

或者,您可以在每个行中映射值和代码:

dict( enumerate(df['x'].cat.categories ) )

# {0: 'bad', 1: 'good', 2: 'great'}

这里的情况更加透明,因此可以说更安全。它的效率也低得多,因为dict( zip( df['x'].cat.codes, df['x'] ) ) # {0: 'bad', 1: 'good', 2: 'great'} 的参数长度为zip(),而len(df)的长度只是唯一值的计数,通常比df['x'].cat.categories短得多

补充讨论

方法1的工作原理是类别具有类型索引:

len(df)

在这种情况下,您可以像查找列表一样在索引中查找值。

有几种方法可以验证方法1的工作原理。首先,您可以检查往返是否保留正确的值:

type( df['x'].cat.categories )

# pandas.core.indexes.base.Index

或者你可以检查方法1和方法2给出相同的答案:

(df['x'] == df['x'].cat.codes.map( dict( 
            enumerate(df['x'].cat.categories) ) ).astype('category')).all()
# True

答案 1 :(得分:5)

这是我基于Matheus Araujo的答案的解决方案。

假设我们有一个“国家/地区”列。首先,您必须将列转换为分类数据类型:

df.country = df.country.astype('category')

获取每个值的代码作为数组:

df.country.cat.codes

将codes数组转换回字符串

df.country.cat.categories[df.country.cat.codes]

您还可以传递整数列表

df.country.cat.categories[[0, 1, 2]]

或单个代码

df.country.cat.categories[0]

答案 2 :(得分:1)

如果运行此命令:

std::vector<Cell *>

它将返回与映射中的“ item”相对应的代码(例如0)。

如果运行此命令:

python3 -m pip install requests --user

它将返回对应于映射位置0的代码值(例如“ item”)