tablas seleccionar recorrer panda notebook graficar funciones filas documentacion data con columnas columna agregar python pandas dummy-data categorical-data

recorrer - seleccionar filas y columnas en python



Crea maniquĂ­es de la columna con mĂșltiples valores en pandas (4)

Creo que esta pregunta necesita una respuesta actualizada después de encontrar el MultiLabelBinarizer de sklearn.

El uso de esto es tan simple como ...

# Instantiate the binarizer mlb = MultiLabelBinarizer() # Using OP''s original data frame df = pd.DataFrame(data=[''A'', ''B'', ''C'', ''D'', ''A*C'', ''C*D''], columns=["label"]) print(df) label 0 A 1 B 2 C 3 D 4 A*C 5 C*D # Convert to a list of labels df = df.apply(lambda x: x["label"].split("*"), axis=1) print(df) 0 [A] 1 [B] 2 [C] 3 [D] 4 [A, C] 5 [C, D] dtype: object # Transform to a binary array array_out = mlb.fit_transform(df) print(array_out) [[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1] [1 0 1 0] [0 0 1 1]] # Convert back to a dataframe (unnecessary step in many cases) df_out = pd.DataFrame(data=array_out, columns=mlb.classes_) print(df_out) A B C D 0 1 0 0 0 1 0 1 0 0 2 0 0 1 0 3 0 0 0 1 4 1 0 1 0 5 0 0 1 1

Esto también es muy rápido, prácticamente no tomó tiempo (.03 segundos) en 1000 filas y 50K clases.

Estoy buscando una forma pitónica para manejar el siguiente problema.

El método pandas.get_dummies() es excelente para crear maniquíes a partir de una columna categórica de un marco de datos. Por ejemplo, si la columna tiene valores en [''A'', ''B''] , get_dummies() crea 2 variables ficticias y asigna 0 o 1 en consecuencia.

Ahora, necesito manejar esta situación. Una sola columna, llamémosla ''etiqueta'', tiene valores como [''A'', ''B'', ''C'', ''D'', ''A*C'', ''C*D''] . get_dummies() crea 6 dummies, pero solo quiero 4 de ellos, por lo que una fila podría tener varios 1s.

¿Hay alguna manera de manejar esto de una manera pitónica? Solo pude pensar en algún algoritmo paso a paso para obtenerlo, pero eso no incluiría get_dummies (). Gracias

Editado, espero que sea más claro!


Puede generar el marco de datos de los maniquíes con sus datos sin procesar, aislar las columnas que contienen un átomo dado y luego almacenar las coincidencias de resultados de nuevo en la columna de átomos.

df Out[28]: label 0 A 1 B 2 C 3 D 4 A*C 5 C*D dummies = pd.get_dummies(df[''label'']) atom_col = [c for c in dummies.columns if ''*'' not in c] for col in atom_col: ...: df[col] = dummies[[c for c in dummies.columns if col in c]].sum(axis=1) ...: df Out[32]: label A B C D 0 A 1 0 0 0 1 B 0 1 0 0 2 C 0 0 1 0 3 D 0 0 0 1 4 A*C 1 0 1 0 5 C*D 0 0 1 1


Sé que ha pasado un tiempo desde que se hizo esta pregunta, pero hay (al menos ahora hay) una sola línea que es compatible con la documentación :

In [4]: df Out[4]: label 0 (a, c, e) 1 (a, d) 2 (b,) 3 (d, e) In [5]: df[''label''].str.join(sep=''*'').str.get_dummies(sep=''*'') Out[5]: a b c d e 0 1 0 1 0 1 1 1 0 0 1 0 2 0 1 0 0 0 3 0 0 0 1 1


Tengo una solución algo más limpia. Supongamos que queremos transformar el siguiente marco de datos

pageid category 0 0 a 1 0 b 2 1 a 3 1 c

dentro

a b c pageid 0 1 1 0 1 1 0 1

Una forma de hacerlo es utilizar el DictVectorizer de scikit-learn. Sin embargo, estaría interesado en aprender sobre otros métodos.

df = pd.DataFrame(dict(pageid=[0, 0, 1, 1], category=[''a'', ''b'', ''a'', ''c''])) grouped = df.groupby(''pageid'').category.apply(lambda lst: tuple((k, 1) for k in lst)) category_dicts = [dict(tuples) for tuples in grouped] v = sklearn.feature_extraction.DictVectorizer(sparse=False) X = v.fit_transform(category_dicts) pd.DataFrame(X, columns=v.get_feature_names(), index=grouped.index)