Tiempo estimado de lectura: 3 minutos
¿Estás intentando aprender python, y en el proceso te encuentras con este error e intentas entender por qué se produce?
En esencia, esto suele ocurrir cuando tienes más de un marco de datos y en el proceso de escribir tu programa estás intentando utilizar los marcos de datos y sus datos, pero hay un desajuste en el número de elementos en cada uno que el programa no puede procesar hasta que se arregle.
Una situación común en la que esto puede ocurrir es cuando se unen marcos de datos o se dividen los datos, lo que se demostrará a continuación.
Escenario 1 - Unir marcos de datos
Donde tenemos df1[['a']] = df2 estamos asignando los valores del lado izquierdo del signo de igualdad a lo que está a la derecha.
Cuando miramos el lado derecho tiene tres columnas, el lado izquierdo tiene una.
Como resultado, aparecerá el error "ValueError: Las columnas deben tener la misma longitud que la clave", como se indica a continuación.
import pandas as pd
list1 = [1,2,3]
list2 = [[4,5,6],[7,8,9]]
df1 = pd.DataFrame(list1,columns=['column1'])
df2 = pd.DataFrame(list2,columns=['column2','column3','column4'])
df1[['a']] = df2
El código anterior arroja el siguiente error:
El objetivo aquí es tener todas las columnas del lado derecho, al lado de las columnas del lado izquierdo de la siguiente manera:
Lo que hemos hecho es igualar ambos lados en cuanto al número de columnas a mostrar de df2
Esencialmente estamos tomando la columna de DF1, y luego trayendo las tres columnas de DF2.
La columna, columnab, columnac de abajo corresponden a las tres columnas de DF2, y almacenarán los datos de ellas.
La solución a este problema es: df1[['columna','columnb','columnc']] = df2
print (df1)
Escenario 2 - Dividir los datos
Puede haber una ocasión en la que tengas una lista python, y necesites dividir los valores de esa lista en columnas separadas.
new_list1 = ['1 2 3']
df1_newlist = pd.DataFrame(new_list1,columns=['column1'])
En lo anterior, hemos creado una lista, con tres valores que forman parte de una cadena. Aquí lo que buscamos es crear una nueva columna con el siguiente código:
df1_newlist[["column1"]] = df1_newlist["column1"].str.split(" ", expand=True) #Splitting based on the space between the values.
print(df1_newlist)
Cuando ejecutamos lo anterior arroja el siguiente error de valor:
La razón por la que arroja el error es que la lógica tiene tres valores a repartir en tres columnas, pero sólo hemos definido una columna en df1_newlist[["columna1"]]
Para solucionar esto, ejecutamos el siguiente código:
df1_newlist[["column1","column2","column3"]] = df1_newlist["column1"].str.split(" ", expand=True) #Splitting based on the space between the values.
print(df1_newlist)
Esto devuelve la siguiente salida, ¡con el problema solucionado!