Estoy tratando de hacer el equivalente de los siguientes comandos en python:

test <- data.frame(convert_me=c('Convert1','Convert2','Convert3'),
                   values=rnorm(3,45, 12), age_col=c('23','33','44'))
test

library(reshape2)
t <- dcast(test, values ~ convert_me+age_col, length  )
t

Eso es esto:

convert_me   values     age_col
Convert1     21.71502      23
Convert2     58.35506      33
Convert3     60.41639      44

Se convierte en esto:

values     Convert2_33 Convert1_23 Convert3_44
21.71502          0           1           0
58.35506          1           0           0
60.41639          0           0           1

Sé que con las variables ficticias puedo obtener el valor de las columnas y transformarlas como el nombre de la columna, pero ¿hay alguna manera de fusionarlas (combinación) fácilmente, como lo hace R?

11
Adriano Almeida 2 sep. 2014 a las 12:05

2 respuestas

La mejor respuesta

Puede usar la función crosstab para esta:

In [14]: pd.crosstab(index=df['values'], columns=[df['convert_me'], df['age_col']])
Out[14]: 
convert_me  Convert1  Convert2  Convert3
age_col           23        33        44
values                                  
21.71502           1         0         0
58.35506           0         1         0
60.41639           0         0         1

O el pivot_table (con len como la función de agregación, pero aquí tienes que fillna los NaNs con ceros manualmente):

In [18]: df.pivot_table(index=['values'], columns=['age_col', 'convert_me'], aggfunc=len).fillna(0)
Out[18]: 
age_col           23        33        44
convert_me  Convert1  Convert2  Convert3
values                                  
21.71502           1         0         0
58.35506           0         1         0
60.41639           0         0         1

Vea aquí los documentos sobre esto: http : //pandas.pydata.org/pandas-docs/stable/reshaping.html#pivot-tables-and-cross-tabulations

La mayoría de las funciones en pandas devolverán un índice multinivel (jerárquico), en este caso para las columnas. Si quieres 'derretir' esto en un nivel como en R, puedes hacer:

In [15]: df_cross = pd.crosstab(index=df['values'], columns=[df['convert_me'], df['age_col']])

In [16]: df_cross.columns = ["{0}_{1}".format(l1, l2) for l1, l2 in df_cross.columns]

In [17]: df_cross
Out[17]: 
          Convert1_23  Convert2_33  Convert3_44
values                                         
21.71502            1            0            0
58.35506            0            1            0
60.41639            0            0            1
9
joris 2 sep. 2014 a las 08:35

Podemos usar la función pd.get_dummies. En los pandas actuales 0.22.0, es común usar { {X1}} cuando se codifica en caliente a Dataframe.

import pandas as pd

df_dummies = pd.get_dummies(
    df[['convert_me', 'age_col']].apply(lambda x: '_'.join(x.astype(str)), axis=1),
    prefix_sep='')
df = pd.concat([df["values"], df_dummies], axis=1)
# Out[39]:
#      values  Convert1_23  Convert2_33  Convert3_44
# 0  21.71502            1            0            0
# 1  58.35506            0            1            0
# 2  60.41639            0            0            1
2
Keiku 22 feb. 2018 a las 02:44