2017-02-22 1 views
7

Ich versuche, ein neues Dataset zu erhalten oder den Wert der aktuellen Dataset-Spalten in ihre eindeutigen Werte zu ändern. Hier ist ein Beispiel dafür, was ich zu bekommen versuchen:ValueError: Die Länge der Werte entspricht nicht der Länge des Index | Pandas DataFrame.unique()

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 

ich über den Index nicht wirklich interessieren, aber es scheint das Problem zu sein. Mein Code ist bis jetzt ziemlich einfach, ich versuchte 2 Ansätze, 1 mit einem neuen Datenrahmen und einen ohne.

#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 

Ich habe den Fehler "Länge der Werte nicht Länge des Index übereinstimmen" beide Male.

Antwort

7

Der Fehler erscheint, wenn Sie eine Liste der numpy Array unterschiedlicher Länge zu einem Datenrahmen zugeordnet werden versuchen, und es kann wie folgt wiedergegeben werden:

Ein Datenrahmen von vier Reihen:

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

nun eine Liste/Array aus zwei Elementen, um es zuzuweisen versuchen:

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

Beide Fehler aus:

ValueError: Length of values does not match length of index

Da der Datenrahmen vier Zeilen hat, haben die Liste und das Array nur zwei Elemente.

Umgehen Lösung (mit Vorsicht verwenden): die Liste/Array in eine Pandas Series, konvertieren und dann, wenn Sie Zuordnung zu tun, fehlender Index in der Serie wird mit NaN gefüllt wird:

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 

für Ihr spezielles Problem, wenn Sie über den Index oder die Übereinstimmung der Werte zwischen den Spalten sie nicht, können Sie Index für jede Spalte nach dem Fallenlassen der Duplikate zurück:

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 
+0

danke es funktioniert gut! Ich hatte nicht darüber nachgedacht, kleine Frage, dieser Code erzeugte keine NaNs, als ich ihn in CSV speicherte, aber ich habe die Zelle oben in einigen Spalten leer, die ich für Nans halte, die Frage ist: sind NaNs immer an der Spitze sein? –

+0

Ich glaube nicht. Sie sollten unten sein, es sei denn, alle Werte sind für einige Spalten unbenutzt. – Psidom

+0

Ok Ich werde die Lücken mit NaNs füllen und prüfen, ob sich die Ausgabe ändert –

Verwandte Themen