python pandas stata

python - pandas equivalente a la codificación de Stata



(3)

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

rendimientos

val cat 0 10 0 20 1 30

Puede agregar 1 a las labels si desea replicar el comportamiento de Stata:

x[''cat''] = labels+1

Estoy buscando una manera de replicar el comportamiento de codificación en Stata, que convertirá una columna de cadena categórica en una columna numérica.

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

Lo que resulta en:

val cat A 10 A 20 B 30

Me gustaría convertir la columna cat de cadenas a enteros, asignando cada cadena única a un entero (arbitrario) 1-a-1. Daría lugar a:

val cat 1 10 1 20 2 30

O, igual de bueno:

cat val 0 1 10 1 1 20 2 2 30

¿Alguna sugerencia?

Muchas gracias como siempre, Rob


Suponiendo que tiene el conjunto fijo de letras inglesas en mayúscula como su variable categórica, también puede hacer esto:

x[''cat''] = x.cat.map(lambda x: ord(x) - 64)

Creo que es un poco hack. Pero, de nuevo, en Python, lo mejor sería definir una asignación de caracteres a enteros que desee, como

my_map = {"A":1, ...} # e.g.: {x:ord(x)-64 for x in string.ascii_uppercase} # if that''s the convention you happen to desire.

y luego hacer

x[''cat''] = x.cat.map(lambda x: my_map[x])

o algo similar.

Esto es superior a la dependencia de las convenciones de las funciones incorporadas para su asignación de enteros, por numerosas razones, y (IMO) son cosas como esta las conversiones "molestas" al programador-analista, pero en realidad representan metadatos importantes sobre el software que está escribiendo, que expone la debilidad real de las funciones de conveniencia globales en lenguajes de nivel superior como MATLAB, STATA, etc. Incluso si hay una función incorporada que se adhiere aleatoriamente a la convención particular que desea usar ( la convención arbitraria de que "A" está mapeado a 1, "B" está mapeado a 2, etc.) no es una buena idea usarlo.


El comando de encode de Stata comienza con una variable de cadena y crea una nueva variable entera con etiquetas mapeadas a la variable de cadena original. El análogo directo de esto en los pandas sería ahora el tipo de variable categórica que se convirtió en una parte de pleno derecho de los pandas comenzando en 0.15 (que se lanzó después de que esta pregunta fue hecha y respondida originalmente).

Ver documentación aquí .

Para demostrar este ejemplo, el comando Stata sería algo así como:

encode cat, generate(cat2)

mientras que el comando pandas sería:

x[''cat2''] = x[''cat''].astype(''category'') cat val cat2 0 A 10 A 1 A 20 A 2 B 30 B

Al igual que Stata hace con la encode , los datos se almacenan como enteros, pero se muestran como cadenas en la salida predeterminada.

Puede verificar esto utilizando el cat acceso categórico para ver el número entero subyacente. (Y por esa razón probablemente no quiera usar ''cat'' como nombre de columna).

x[''cat2''].cat.codes 0 0 1 0 2 1