熊猫相当于Stata的编码

Lon*_*Rob 15 python stata pandas

我正在寻找一种方法来复制Stata中的编码行为,它将分类字符串列转换为数字列.

x = pd.DataFrame({'cat':['A','A','B'], 'val':[10,20,30]})
x = x.set_index('cat')
Run Code Online (Sandbox Code Playgroud)

结果如下:

     val
cat     
A     10
A     20
B     30
Run Code Online (Sandbox Code Playgroud)

我想将cat列从字符串转换为整数,将每个唯一字符串映射到(任意)整数1对1.这将导致:

     val
cat     
1     10
1     20
2     30
Run Code Online (Sandbox Code Playgroud)

或者,同样好:

  cat  val
0   1   10
1   1   20
2   2   30
Run Code Online (Sandbox Code Playgroud)

有什么建议?

非常感谢Rob

unu*_*tbu 16

你可以使用pd.factorize:

import pandas as pd

x = pd.DataFrame({'cat':('A','A','B'), 'val':(10,20,30)})
labels, levels = pd.factorize(x['cat'])
x['cat'] = labels
x = x.set_index('cat')
print(x)
Run Code Online (Sandbox Code Playgroud)

产量

     val
cat     
0     10
0     20
1     30
Run Code Online (Sandbox Code Playgroud)

labels如果您希望复制Stata的行为,可以添加1 :

x['cat'] = labels+1
Run Code Online (Sandbox Code Playgroud)

  • @unutbu这应该放在文档中,你可以在这里的某个地方做一个PR:http://pandas.pydata.org/pandas-docs/dev/reshaping.html#computing-indicator-dummy-variables (4认同)
  • 得到[0,0,1]的另一种方法是查看`pd.Categorical(seq).labels`. (2认同)

Joh*_*hnE 8

Stata的encode命令以字符串变量开头,并创建一个新的整数变量,其标签映射到原始字符串变量.大熊猫的直接类比现在是分类变量类型,它成为大熊猫的一个完整部分,从0.15开始(在最初询问和回答这个问题后发布).

见文档这里.

为了演示此示例,Stata命令将类似于:

encode cat, generate(cat2)
Run Code Online (Sandbox Code Playgroud)

而pandas命令将是:

x['cat2'] = x['cat'].astype('category')

  cat  val cat2
0   A   10    A
1   A   20    A
2   B   30    B
Run Code Online (Sandbox Code Playgroud)

正如Stata所做的那样encode,数据存储为整数,但在默认输出中显示为字符串.

您可以使用分类访问器cat来查看基础整数来验证这一点.(因此您可能不希望使用'cat'作为列名.)

x['cat2'].cat.codes

0    0
1    0
2    1
Run Code Online (Sandbox Code Playgroud)