ValueError: длина значений не соответствует длине фрейма данных index | Pandas.уникальный()

Я пытаюсь получить новый набор данных, или изменить значение текущего столбца набора данных уникальных значений. Вот пример того, что я пытаюсь сделать :

   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 с новым фреймом данных и один без.

#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

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

1 ответов


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

фрейм данных из четырех строк:

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

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

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

обе ошибки:

ValueError: длина значений не соответствует длине индекса

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

обойти решение (используйте с осторожностью): преобразуйте список / массив в серию pandas, а затем, когда вы выполните назначение, отсутствующий индекс в серии будет заполнен Нэн:

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