set_index не работает должным образом для фрейма данных pandas

#python #pandas #indexing

#python #pandas #индексирование

Вопрос:

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

 def find_highest_confs(dictOfCurves):
"""
Parameters
----------
dictOfCurves : Function takes in a dictionary containing stocks(key) and a 
dataframe per stock containing stocktrend data for that stock

Returns
-------
multipleConfs : A dataframe with per row the stock (ticker symbol), start 
date of the highest order trend, the nr of times that trend was confirmed 
and the date of last confirmation

"""
multipleConfs = pd.DataFrame(columns = ['symbol', 'max confirmations', 
                                        'Launch date', 'Last confirmation'])
for item in dictOfCurves:

    df            = dictOfCurves[item]
    
    try:
        df.sort_values(by = ['confirmations'], ascending = False, inplace = True)    

        maxLaunchDate = df[df['confirmations'] == df['confirmations'].max()].index[0]
        lastConf      = df.loc[maxLaunchDate, 'Last confirmation']
        newData       = {'symbol': item, 'max confirmations': df['confirmations'].max(), 
                         'Launch date': maxLaunchDate, 'Last confirmation': lastConf} 
    except:
        newData       = {'symbol': item, 'max confirmations': np.nan, 'Launch date': np.nan, 
                         'Last confirmation': np.nan} 

    multipleConfs     = multipleConfs.append(newData, ignore_index = True)

return multipleConfs
  

Теперь этот код работает нормально и возвращает df, например:

 highest = find_highest_confs(curves)
  

что приводит к созданию фрейма данных, как и ожидалось, без набора индекса.

если я затем установлю индекс следующим образом:

 highest.set_index('symbol', inplace = True)
  

это опять же работает так, как ожидалось.

Вот странная вещь…

Если я изменю последнюю строку в функции на:

 return multipleConfs.set_index('symbol', inplace = True)
  

он возвращает пустое NoneType ?

Я также попытался добавить multipleConfs.set_index('symbol', inplace = True) оператор на одну строку раньше, а затем вернуть его. Тот же результат?

Я действительно смущен тем, почему я не могу установить индекс как часть кода в функции?

Ответ №1:

Да, вы не можете использовать inplace параметр здесь. Inplace возвращает объект None. Удалите параметр ‘inplace’. Или выполните эту строку перед возвращением и return multipleConfs . С inplace = False помощью (по умолчанию, если не определено) этот оператор возвращает объект фрейма данных.

 return multipleConfs.set_index('symbol')
  

или

 multipleConfs.set_index('symbol', inplace = True)
return multipleConfs
  

Комментарии:

1. Это именно то, что, как я думал, должно работать, но не работает? Если я сделаю так, как вы предлагаете, он вернет пустой фрейм данных. Если я не задаю индекс (согласно коду в моем исходном сообщении), он возвращает фрейм данных, как и ожидалось. ???

Ответ №2:

Вы должны указать столбец фрейма данных в аргументе:

 multipleConfs.set_index(multipleConfs['symbol'])