2017-02-22 8 views
7

Я пытаюсь получить новый набор данных или изменить значение текущих столбцов набора данных на их уникальные значения. Вот пример того, что я пытаюсь получить:ValueError: Длина значений не соответствует длине индекса | 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 

Я не забочусь об индексе, но это, кажется, проблема. Мой код до сих пор довольно прост, я пробовал 2 подхода, 1 с новым dataFrame и без него.

#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 

У меня есть ошибка «Длина значений не соответствует длине индекса» оба раза.

ответ

7

ошибка появляется, когда вы пытаетесь присвоить список Numpy массива разной длины кадра данных, и он может быть воспроизведен следующим образом:

Кадр данных из четырех рядов:

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

Теперь пытается присвоить список/массив из двух элементов к нему:

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

Обе ошибки вне:

ValueError: Length of values does not match length of index

Поскольку кадр данных имеет четыре строки, а список и массив имеют только два элемента.

Работа вокруг решения (использовать с осторожностью): преобразовать список/массив в серии панд, а затем, когда вы делаете назначение, отсутствующий индекс в серии будет заполнен 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 

для вашей конкретной проблемы, если вы не заботитесь об индексе или соответствии значений между столбцами, вы можете сбросить индекс для каждого столбца после падения дублированных:

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

спасибо, что он работает нормально! Я не думал об этом таким образом, маленький вопрос, этот код не генерировал никаких NaN, когда я сохранил его в csv, но у меня есть пробелы в верхней части некоторых столбцов, которые, я полагаю, являются Nans, вопрос в том, что: NaNs всегда будет на высоте? –

+0

Я так не думаю. Они должны быть внизу, если все значения не нан для некоторых столбцов. – Psidom

+0

Хорошо, я собираюсь заполнить пробелы с помощью NaN и проверить, не меняется ли выход. –

Смежные вопросы