Cómo establecer el valor de una columna pandas como lista

Quiero establecer el valor de una columna de pandas como una lista de cadenas. Sin embargo, mis esfuerzos para hacerlo no tuvieron éxito porque los pandas toman el valor de la columna como un iterable y obtengo un: ValueError: Must have equal len keys and value when setting with an iterable .

Aquí hay un MWE

 >> df = pd.DataFrame({'col1': [1, 2, 3], 'col2': [4, 5, 6]}) >> df col1 col2 0 1 4 1 2 5 2 3 6 >> df['new_col'] = None >> df.loc[df.col1 == 1, 'new_col'] = ['a', 'b'] ValueError: Must have equal len keys and value when setting with an iterable 

Intenté establecer el dtype como list usando df.new_col = df.new_col.astype(list) y eso tampoco funcionó.

Me pregunto cuál sería el enfoque correcto aquí.


EDITAR

La respuesta que se proporciona aquí: los pandas de Python insertan la lista en una celda usando at tampoco me funcionó.

No es fácil, una posible solución es crear una Series auxiliar:

 df.loc[df.col1 == 1, 'new_col'] = pd.Series([['a', 'b']] * len(df)) print (df) col1 col2 new_col 0 1 4 [a, b] 1 2 5 NaN 2 3 6 NaN 

Otra solución, si es necesario establecer valores perdidos en la lista vacía también es usar la comprensión de la lista:

 #df['new_col'] = [['a', 'b'] if x == 1 else np.nan for x in df['col1']] df['new_col'] = [['a', 'b'] if x == 1 else [] for x in df['col1']] print (df) col1 col2 new_col 0 1 4 [a, b] 1 2 5 [] 2 3 6 [] 

Pero luego pierde la funcionalidad vectorizada que acompaña el uso de matrices NumPy mantenidas en bloques de memoria contiguos.

No hagas esto

Pandas nunca fue diseñado para mantener listas en series / columnas. Puede inventar soluciones alternativas costosas, pero no se recomiendan.

La razón principal por la que no se recomienda mantener las listas en serie es que se pierde la funcionalidad vectorizada que acompaña al uso de matrices NumPy en bloques de memoria contiguos. Su serie será de tipo dtype, que representa una secuencia de punteros, muy parecida a la list . Perderá los beneficios en términos de memoria y rendimiento, así como el acceso a métodos Pandas optimizados.

Vea también ¿Cuáles son las ventajas de NumPy sobre las listas regulares de Python? Los argumentos a favor de Pandas son los mismos que para NumPy.

Dicho esto, ya que va en contra del propósito y el diseño de Pandas, hay muchos que enfrentan el mismo problema y han hecho preguntas similares:

  • Python pandas insertar lista en una celda
  • pandas: ¿cómo almacenar una lista en un dataframe?
  • Responde a esta pregunta

Su respuesta es simple: seleccione la columna para convertir a la lista aquí

 my_list = df["col1"].tolist() >>> df = pd.DataFrame({'col1': [1, 2, 3], 'col2': [4, 5, 6]}) >>> df col1 col2 0 1 4 1 2 5 2 3 6 >>> my_list = df["col1"].tolist() >>> my_list [1, 2, 3] 

Puedes probar el siguiente código:

 list1=[1,2,3] list2=[4,5,6] col=[str(“,”.join(map(str, list1))), str(“,”.join(map(str, list2)))] df=pd.DataFrame(np.random.randint(low=0, high=0, size(5,2)), columns=col) print(df) 

Espero que esta sea la salida esperada:

También utilizando np.where :

 df['new_col'] = np.where(df.col1 == 1, pd.Series([['a', 'b']]) , np.nan)