web-dev-qa-db-fra.com

ValueError: la longueur des valeurs ne correspond pas à la longueur de l'index | Pandas DataFrame.unique ()

J'essaie d'obtenir un nouvel ensemble de données ou de modifier la valeur des colonnes de l'ensemble de données actuel en leurs valeurs uniques. Voici un exemple de ce que je cherche à obtenir:

   A B
 -----
0| 1 1
1| 2 5
2| 1 5
3| 7 9
4| 7 9
5| 8 9

Wanted Result    Not Wanted Result
       A B            A B
     -----          -----
    0| 1 1         0| 1 1
    1| 2 5         1| 2 5
    2| 7 9         2| 
    3| 8           3| 7 9
                   4|
                   5| 8

Je ne me soucie pas vraiment de l'indice, mais il semble que ce soit le problème. Mon code est jusqu'ici assez simple, j'ai essayé deux approches, une avec un nouveau dataFrame et une sans.

#With New DataFrame
 def UniqueResults(dataframe):
    df = pd.DataFrame()
    for col in dataframe:
        S=pd.Series(dataframe[col].unique())
        df[col]=S.values
    return df

#Without new DataFrame
def UniqueResults(dataframe):
    for col in dataframe:
        dataframe[col]=dataframe[col].unique()
    return dataframe

J'ai l'erreur "La longueur des valeurs ne correspond pas à la longueur de l'index" les deux fois.

30
Mayeul sgc

L'erreur survient lorsque vous essayez d'affecter une liste de tableaux numpy de différentes longueurs à une trame de données. Cette dernière peut être reproduite comme suit:

Un cadre de données de quatre lignes:

df = pd.DataFrame({'A': [1,2,3,4]})

Maintenant essayant de lui assigner une liste/tableau de deux éléments:

df['B'] = [3,4]   # or df['B'] = np.array([3,4])

Les deux erreurs sur:

ValueError: la longueur des valeurs ne correspond pas à la longueur de l'index

Parce que le cadre de données comporte quatre lignes mais que la liste et le tableau ne comportent que deux éléments.

Solution de contournement (à utiliser avec prudence): convertissez la liste/le tableau en une série pandas, et puis quand vous faites l'affectation, l'index manquant dans la série sera rempli avec NaN :

df['B'] = pd.Series([3,4])

df
#   A     B
#0  1   3.0
#1  2   4.0
#2  3   NaN          # NaN because the value at index 2 and 3 doesn't exist in the Series
#3  4   NaN

Pour votre problème spécifique, si vous ne vous souciez pas de l'index ou de la correspondance des valeurs entre les colonnes, vous pouvez réinitialiser l'index pour chaque colonne après avoir supprimé les doublons:

df.apply(lambda col: col.drop_duplicates().reset_index(drop=True))

#   A     B
#0  1   1.0
#1  2   5.0
#2  7   9.0
#3  8   NaN
36
Psidom