2017-02-22 16 views
7

Yeni bir veri kümesi almaya çalışıyorum veya geçerli veri kümesi sütunlarının değerini benzersiz değerleriyle değiştirmeye çalışıyorum. İşte almaya çalışıyorum ne bir örnek:ValueError: Değerlerin uzunluğu dizin uzunluğuna uymuyor | Pandalar 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 

Gerçekten endeksi umurumda değil ama sorun gibi görünüyor. Şimdiye kadarki kodum oldukça basit, 1 yeni bir dataFrame ve bir tane olmaksızın 2 yaklaşım denedim.

#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 

"Değerlerin Uzunluğu, dizinin uzunluğuna uymuyor" hatasını her iki kez aldım.

cevap

7

hata aşağıdaki gibi bir veri çerçevesine farklı uzunlukta numpy dizinin listesini atamaya çalışıyorsunuz ve bu yeniden olabilir çıkageldi:

dört satır bir veri çerçevesi:

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

Şimdi bir liste atamak için çalışıyor/dizi:

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

Hem hatalar dışarı:

Veri çerçevesinin dört satırı olduğundan, liste ve dizinin yalnızca iki öğesi vardır. Çözüm etrafında

Çalışma (dikkatli kullanın): Bir pandalar Serisine listesi/dizi dönüştürmek ve atama yaparken, daha sonra Serisi eksik indeks NaN ile doldurulur:

Dizinde veya sütunlar arasındaki değerlerin yazışma umurumda değil eğer belirli sorun için

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 
, sen çiftleri bıraktıktan sonra her sütun için indeks sıfırlayabilirsiniz:

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

teşekkürler iyi çalışıyor! Bu şekilde düşünmemiştim, küçük soru, bu kod, csv'ye kaydettiğimde herhangi bir NaN oluşturmadı, ama sanırım Nans, sanırım bazı sütunların tepesinde hücreler var, soru: NaNs her zaman üstte olacak? –

+0

Ben öyle düşünmüyorum. Tüm değerler bazı sütunlar için nan olmadıkça en altta olmalıdırlar. – Psidom

+0

Tamam NaN'leri kullanarak boşlukları dolduracağım ve çıkışın –

İlgili konular