ValueError: lengte van waarden komt niet overeen met lengte van index | Panda’s DataFrame.unique()

Ik probeer een nieuwe dataset te krijgen of de waarde van de huidige datasetkolommen te wijzigen in hun unieke waarden.
Hier is een voorbeeld van wat ik probeer te krijgen:

  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

Ik geef niet echt om de index, maar het lijkt het probleem te zijn.
Mijn code tot nu toe is vrij eenvoudig, ik heb 2 benaderingen geprobeerd, 1 met een nieuw dataFrame en een zonder.

#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

Ik krijg beide keren de foutmelding “Lengte van waarden komt niet overeen met lengte van index”.


Antwoord 1, autoriteit 100%

De fout treedt op wanneer u probeert een lijst met numpy-arrays van verschillende lengte toe te wijzen aan een dataframe, en deze kan als volgt worden gereproduceerd:

Een dataframe van vier rijen:

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

Probeer er nu een lijst/array van twee elementen aan toe te wijzen:

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

Beide fouten eruit:

ValueError: lengte van waarden komt niet overeen met lengte van index

Omdat het dataframe vier rijen heeft, maar de lijst en array slechts twee elementen.

Omzeilingsoplossing(voorzichtig gebruiken): converteer de lijst/array naar een panda-serie, en wanneer u de opdracht uitvoert, wordt de ontbrekende index in de serie gevuld met 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

Voor uw specifieke probleem, als u niet geïnteresseerd bent in de index of de overeenkomst van waarden tussen kolommen, kunt u de index voor elke kolom opnieuw instellen nadat u de duplicaten hebt verwijderd:

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

Other episodes