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)
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)