2017-02-22 22 views
7

Próbuję uzyskać nowy zestaw danych lub zmienić wartość kolumn bieżących dataset na ich unikalne wartości. Oto przykład tego, co staram się dostać:ValueError: Długość wartości nie odpowiada długości indeksu | 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 

nie troszczą się o indeksie, ale wydaje się być problemem. Mój kod do tej pory jest całkiem prosty, próbowałem 2 podejść, 1 z nową ramką danych i jedną bez.

#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 

Mam błąd "Długość wartości nie pasuje długość indeksu" zarówno razy.

Odpowiedz

7

Błąd pojawia się, gdy trzeba przypisać listę numpy tablicy różnej długości ramki danych, a to może być powielana następująco:

Ramka danych z czterech rzędów:

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

teraz próbuje przypisać listę/tablicy z dwóch elementów do niego:

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

Oba błędy oUT:

ValueError: Length of values does not match length of index

Ponieważ ramka danych ma cztery wiersze, ale lista i tablica mają tylko dwa elementy.

obejść Rozwiązanie (korzystanie z ostrożnością): konwersja listy/tablicy do serialu pandy, a następnie, kiedy wykonujesz zadanie, brakujące indeksu w serii będzie wypełniona 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 

dla konkretnego problemu, jeśli nie dbają o indeksie lub korespondencji między wartościami kolumn, można zresetować wskaźnik dla każdej kolumny, po spadku duplikaty:

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

dzięki temu działa dobrze! Nie myślałem o tym w ten sposób, małe pytanie, ten kod nie generował żadnych NaNs, gdy zapisałem go do csv, ale mam pustą komórkę na górze niektórych kolumn, które, jak przypuszczam, są Nans, pytanie brzmi: są NaNs zawsze będzie na górze? –

+0

Nie sądzę. Powinny być na dole, chyba że dla niektórych kolumn wszystkie wartości są nan. – Psidom

+0

OK Wypełnię puste pola z NaN i sprawdzę, czy wyjście zmienia się. –