Perdóname si mi pregunta fue un poco ambigua. intentará ser mejor junior bb.

Pregunta.

Tengo DataFrame como a continuación, que recibí de la colmena DB.

Cómo extraer el valor 'cat' y 'animal', 'dog' en la columna col2, lo que sea.

In[]:
sample = {'col1': ['cat', 'dog'], 'col2': ['WrappedArray([animal], [cat])', 'WrappedArray([animal], [dog])']}
df = pd.DataFrame(data=sample)
df

out[] :
    col1                            col2
-----------------------------------------
0   cat     WrappedArray([animal], [cat])
1   dog     WrappedArray([animal], [dog])

Traté de convertir el objeto en una matriz y extraer los datos como este código.

In[]: df['col2'][0][1]
Out[]: cat

Si me equivoco, tengo que intentarlo de otra manera porque soy un novato en Pandas Dataframe. ¿Alguien podría decirme cómo funciona?

Gracias de antemano.

0
yafomars 23 feb. 2020 a las 21:42

2 respuestas

La mejor respuesta

Los datos en la segunda columna col2 parecen ser simplemente cadenas.

La salida de df['col2'][0][1] sería "r", que es el segundo carácter (índice 1) en la primera cadena. Para obtener "cat" necesitaría alterar las cadenas y eliminar las cosas 'WrappedArray([animal]...'. dejando solo los datos reales. "gato", "perro", etc.

Puedes probar df['col2'].iloc[0][24:27], pero esa no es una solución general. También sería frágil e imposible de mantener.

Si tiene algún control sobre cómo se exportan los datos de la base de datos, intente obtener los datos en un formato más limpio, es decir, sin las cosas WrappedArray(....

Las expresiones regulares pueden ser útiles aquí.

Podrías probar algo como esto:

import re

wrapped = re.compile(r'\[(.*?)\].+\[(.*?)\]')
element = wrapped.search(df['col2'].iloc[0]).group(2)

* Peligro Peligro Peligro *

Si necesitas esa funcionalidad. Puede crear una función WrappedArray que devuelva el contenido como una lista de cadenas o similares. Luego puede llamarlo usando eval(df['col2'][0][1]).

No hagas esto.

FYI:

Es probable que sus dtypes hayan sido predeterminados en objeto, porque no los especificó cuando creó su marco de datos. Puedes hacer eso así:

df = pd.DataFrame(data=sample, dtype='string')

Además, se recomienda usar iloc para indexar marcos de datos por índice.

1
rkedge 23 feb. 2020 a las 20:59

Lo resolví como @rkedge me aconsejó

Los datos están escritos en un idioma extranjero.

Como dije, DataFrame tiene datos de objeto escritos con 'WrappedArray ([우주 ご ぎ ゅ], [ぎ ゃ], [한국어])'.

df_ = df['col2'].str.extractall(r'([REGEX expression]+)')
df_

0   0   우주ごぎゅ
0   1   ぎゃ
0   2   한국어
1   0   cat
2   0   animal
0
yafomars 24 feb. 2020 a las 17:08