Una columna en un marco de datos de pandas contiene listas de valores.

Usando un diccionario, me gustaría crear una nueva columna con valores mapeados usando el diccionario, y para cualquier valor que no esté en el diccionario, esos valores se eliminan.

Aquí está un ejemplo mínimo:

Configuración del marco de datos

df = pd.DataFrame(data={ 'B': ['x', 'y', 'z']})
df.at[0, 'B'] = ['jki', 'gg4', 'k6k']
df.at[1, 'B'] = ['2f4', 'gg4', 'g24']
df.at[2, 'B'] = ['1k1', 'g24', '1k1', '2f4']

Resultados en

df

      B
0   [jki, gg4, k6k]
1   [2f4, gg4, g24]
2   [1k1, g24, 1k1, 2f4]

Configuración del diccionario.

conv = { 'jki': 1, 'gg4': 2, '2f4': 3 , 'g24':4, }

Si la columna no fuera una lista, se usaría este código

df['MappedA'] = df.B.map(conv)

Pero como la columna contiene listas, ese código no se puede usar

Esto es lo que me gustaría que fuera el resultado

                      B                  MappedA
0   [jki, gg4, k6k]                [ 1 ,  2 ]
1   [2f4, gg4, g24]              [3, 2, 4]
2   [1k1, g24, 1k1, 2f4]        [ 4 , 3  ]
2
SantoshGupta7 10 sep. 2018 a las 05:40

3 respuestas

La mejor respuesta

Usando una lista anidada de comprensión y búsqueda de diccionario:

df.assign(mapped=[[conv[k] for k in row if conv.get(k)] for row in df.B])
                      B     mapped
0       [jki, gg4, k6k]     [1, 2]
1       [2f4, gg4, g24]  [3, 2, 4]
2  [1k1, g24, 1k1, 2f4]     [4, 3]
2
user3483203 10 sep. 2018 a las 02:46

Puede usar la función lambda y para cada lista de filas aplicar la función de mapa para obtener valores de diccionario

df.B.apply(lambda x:list(filter(None,map(conv.get,x))))

Fuera:

0       [1, 2]
1    [3, 2, 4]
2       [4, 3]
Name: B, dtype: object
4
Naga Kiran 10 sep. 2018 a las 02:55

Puedes probar con apply y lambda:

df['MappedA'] = df.B.apply(lambda row: [conv[v] for v in row if conv.get(v)])

Salida:

                      B    MappedA
0       [jki, gg4, k6k]     [1, 2]
1       [2f4, gg4, g24]  [3, 2, 4]
2  [1k1, g24, 1k1, 2f4]     [4, 3]
2
student 10 sep. 2018 a las 02:45