Панды выравнивают иерархический мультииндекс

#python #pandas #dataframe #hierarchical

#python #pandas #фрейм данных #иерархический

Вопрос:

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

 df = pd.DataFrame(web.DataReader(stocks, 'yahoo', day, day).iloc[0]).unstack(level=0).droplevel(level=0, axis=1)

Attributes     adjClose        close  ...       volume       date
Symbols                               ...                        
FB           261.399994   261.399994  ...   13587000.0 2020-10-19
AAPL         115.980003   115.980003  ...  120639300.0 2020-10-19
AMZN        3207.209961  3207.209961  ...    5223600.0 2020-10-19
GOOG        1534.609985  1534.609985  ...    1607100.0 2020-10-19
NFLX                NaN          NaN  ...          NaN 2020-10-19
  

Я пытаюсь сохранить это в базе данных; однако я не вижу символов в df.columns.
Чтобы сохранить df в следующем формате:

 Symbols       adjClose        close  ...       volume       date 
FB           261.399994   261.399994  ...   13587000.0 2020-10-19
AAPL         115.980003   115.980003  ...  120639300.0 2020-10-19
AMZN        3207.209961  3207.209961  ...    5223600.0 2020-10-19
GOOG        1534.609985  1534.609985  ...    1607100.0 2020-10-19
NFLX                NaN          NaN  ...          NaN 2020-10-19
  

Любые предложения о том, как этого добиться? В моей базе данных есть составной ключ для символов, столбцов даты.
Спасибо.

Ответ №1:

Symbols — это ваш индекс dataframes, который вам нужно будет использовать reset_index , чтобы поместить его в сам фрейм. Попробуйте это:

 df = (pd.DataFrame(web.DataReader(stocks, 'yahoo', day, day)
      .iloc[0])
      .unstack(level=0)
      .droplevel(level=0, axis=1)
      .rename_axis(columns=None) # Gets rid of the "Attributes"
      .reset_index()             # Puts "Symbols" as an actual column, not as the index
)
  

Мое дополнение 2:

  • rename_axis Это должно избавиться от вашего заголовка «Атрибуты». Это в основном для визуальных целей при печати, но может сбить с толку людей, которые не привыкли работать с многоиндексными данными. По сути, ваши метки столбцов хранятся в Index объекте. У этого Index объекта может быть имя, поэтому «Атрибуты» — это имя ваших столбцов (довольно странная концепция, которая не очень полезна для обычных индексов, но очень полезна при работе с a MultiIndex ).
  • reset_index() Похоже, что ваш столбец «Символы» на самом деле не является столбцом (именно поэтому он не отображается, df.columns а скорее является индексом для фрейма данных. Добавление этого метода приведет к вставке индекса «Символы» в виде столбца во фрейм данных и созданию нового простого индекса RangeIndex , который охватывает от 0 до длины вашего фрейма данных.