Tengo una lista 'abc' y un marco de datos 'df':
abc = ['foo', 'bar']
df =
A B
0 12 NaN
1 23 NaN
Quiero insertar la lista en la celda 1B, así que quiero este resultado:
A B
0 12 NaN
1 23 ['foo', 'bar']
¿Cómo puedo hacer eso?
1) Si uso esto:
df.ix[1,'B'] = abc
Recibo el siguiente mensaje de error:
ValueError: Must have equal len keys and value when setting with an iterable
porque intenta insertar la lista (que tiene dos elementos) en una fila / columna pero no en una celda.
2) Si uso esto:
df.ix[1,'B'] = [abc]
luego inserta una lista que tiene solo un elemento que es la lista 'abc' ( [['foo', 'bar']]
).
3) Si uso esto:
df.ix[1,'B'] = ', '.join(abc)
luego inserta una cadena: ( foo, bar
) pero no una lista.
4) Si uso esto:
df.ix[1,'B'] = [', '.join(abc)]
luego inserta una lista pero solo tiene un elemento ( ['foo, bar']
) pero no dos como quiero ( ['foo', 'bar']
).
¡Gracias por la ayuda!
EDITAR
Mi nuevo marco de datos y la lista anterior:
abc = ['foo', 'bar']
df2 =
A B C
0 12 NaN 'bla'
1 23 NaN 'bla bla'
Otro marco de datos:
df3 =
A B C D
0 12 NaN 'bla' ['item1', 'item2']
1 23 NaN 'bla bla' [11, 12, 13]
Quiero insertar la lista 'abc' en df2.loc[1,'B']
y / o df3.loc[1,'B']
.
Si el marco de datos tiene columnas solo con valores enteros y / o valores NaN y / o valores de lista, entonces insertar una lista en una celda funciona perfectamente. Si el marco de datos tiene columnas solo con valores de cadena y / o valores NaN y / o valores de lista, entonces insertar una lista en una celda funciona perfectamente. Pero si el marco de datos tiene columnas con valores enteros y de cadena y otras columnas, aparece el mensaje de error si uso esto: df2.loc[1,'B'] = abc
o df3.loc[1,'B'] = abc
.
Otro marco de datos:
df4 =
A B
0 'bla' NaN
1 'bla bla' NaN
Estos insertos funcionan perfectamente: df.loc[1,'B'] = abc
o df4.loc[1,'B'] = abc
.
0.15.0
:df.loc[1,'b'] = ['foo','bar']
Respuestas:
Dado que
set_value
ha quedado obsoleto desde la versión 0.21.0, ahora debería usarat
. Puede insertar una lista en una celda sin generar un "ValueError
comoloc
". Creo que esto se debe a queat
siempre se refiere a un valor único, mientras queloc
puede referirse tanto a valores como a filas y columnas.También debe asegurarse de que la columna en la que está insertando tenga
dtype=object
. Por ejemplofuente
df = pd.DataFrame(data, dtype=object)
ValueError: setting an array element with a sequence.
; vea una respuesta de @ cs95 si obtiene el error.df3.set_value(1, 'B', abc)
funciona para cualquier marco de datos. Tenga cuidado con el tipo de datos de la columna 'B'. P.ej. una lista no se puede insertar en una columna flotante, en ese casodf['B'] = df['B'].astype(object)
puede ayudar.fuente
Pandas> = 0,21
set_value
ha quedado obsoleto. Ahora puede usarDataFrame.at
para establecer por etiqueta yDataFrame.iat
para establecer por posición entera.Establecer valores de celda con
at
/iat
Si desea establecer un valor en la segunda fila de la "B" para alguna lista nueva, use
DataFrane.at
:También puede establecer por posición entera usando
DataFrame.iat
¿Y si consigo
ValueError: setting an array element with a sequence
?Intentaré reproducir esto con:
Esto se debe a que su objeto es de tipo
float64
d, mientras que las listas sonobject
s, por lo que hay una falta de coincidencia allí. Lo que tendría que hacer en esta situación es convertir la columna en objeto primero.Entonces, funciona:
Posible, pero hacky
Aún más loco, descubrí que puedes piratear
DataFrame.loc
para lograr algo similar si pasas listas anidadas.Puede leer más sobre por qué esto funciona aquí.
fuente
Como se menciona en esta publicación pandas: ¿cómo almacenar una lista en un marco de datos? ; los dtypes en el marco de datos pueden influir en los resultados, así como llamar o no asignar un marco de datos.
fuente
Trabajo rápido
Simplemente incluya la lista dentro de una nueva lista, como se hizo para col2 en el marco de datos a continuación. La razón por la que funciona es que Python toma la lista externa (de listas) y la convierte en una columna como si contuviera elementos escalares normales, que son listas en nuestro caso y no escalares normales.
fuente
También obteniendo
ValueError: Must have equal len keys and value when setting with an iterable
,usar .at en lugar de .loc no hizo ninguna diferencia en mi caso, pero hacer cumplir el tipo de datos de la columna del marco de datos hizo el truco:
Luego, podría establecer listas, matrices numpy y todo tipo de cosas como valores de celda única en mis marcos de datos.
fuente