Как переместить столбец pandas под последнюю строку первого столбца?

#python #pandas #dataframe #group-by #pivot

#python #pandas #фрейм данных #группировка по #сводная

Вопрос:

Я пытаюсь манипулировать своим фреймом данных pandas, чтобы я мог:

  1. Создайте новый столбец с пометкой «Ticker».
  2. Переместить столбец ‘AAL’ ниже столбца ‘A’
  3. Пометьте все элементы для столбца ‘A’ как A в новом столбце ‘Ticker’ и AAL для вновь перемещенного столбца ‘AAL’
  4. Переименуйте столбец ‘A’ в ‘Adj Close’
  5. Дублируйте значения индекса в левой части столбца ‘Adj Close’ для строк ‘AAL’.

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

         Adj Close   Adj Close
        A           AAL
Date            
1/11/19 80.22673035 28.54166412
1/12/19 84.7361908  28.57440376
1/1/20  82.17785645 26.74117851
  

Желаемый вывод фрейма данных:

         Ticker      Adj Close
Date            
1/11/19    A        80.22673035
1/12/19    A        84.7361908
1/1/20     A        82.17785645     
1/11/19   AAL       28.54166412
1/12/19   AAL       28.57440376
1/1/20    AAL       26.74117851
  

Возможно ли это, и если да, то каков наилучший способ сделать это?
Я пробовал использовать функцию groupby, а также pivot, но ничего с этим не получилось. Я новичок в python, поэтому, возможно, я делаю что-то не так.

Спасибо за вашу помощь и будьте в безопасности 🙂

РЕДАКТИРОВАТЬ (запрошенный вывод) print(df.to_dict())

 {('Adj Close', 'A'): 
{Timestamp('2019-10-01 00:00:00'): nan, 
Timestamp('2019-11-01 00:00:00'): 80.22673034667969, 
Timestamp('2019-12-01 00:00:00'): 84.73619079589844, 
Timestamp('2020-01-01 00:00:00'): 82.1778564453125, 
Timestamp('2020-02-01 00:00:00'): 76.71327209472656, 
Timestamp('2020-03-01 00:00:00'): 71.28850555419922, 
Timestamp('2020-04-01 00:00:00'): 76.4993667602539, 
Timestamp('2020-05-01 00:00:00'): 87.95530700683594, 
Timestamp('2020-06-01 00:00:00'): 88.18482971191406, 
Timestamp('2020-07-01 00:00:00'): 96.33000183105469, 
Timestamp('2020-08-01 00:00:00'): 100.41999816894531, 
Timestamp('2020-09-01 00:00:00'): 100.94000244140625, 
Timestamp('2020-10-01 00:00:00'): 100.01000213623047, 
Timestamp('2020-10-02 00:00:00'): 100.01000213623047}, 
('Adj Close', 'AAL'): 
{Timestamp('2019-10-01 00:00:00'): nan, 
Timestamp('2019-11-01 00:00:00'): 28.541664123535156, 
Timestamp('2019-12-01 00:00:00'): 28.574403762817383, 
Timestamp('2020-01-01 00:00:00'): 26.741178512573242, 
Timestamp('2020-02-01 00:00:00'): 18.9798583984375, 
Timestamp('2020-03-01 00:00:00'): 12.1899995803833, 
Timestamp('2020-04-01 00:00:00'): 12.010000228881836, 
Timestamp('2020-05-01 00:00:00'): 10.5, 
Timestamp('2020-06-01 00:00:00'): 13.069999694824219, 
Timestamp('2020-07-01 00:00:00'): 11.119999885559082, 
Timestamp('2020-08-01 00:00:00'): 13.050000190734863, 
Timestamp('2020-09-01 00:00:00'): 12.289999961853027, 
Timestamp('2020-10-01 00:00:00'): 13.0, 
Timestamp('2020-10-02 00:00:00'): 13.0}}
  

Ответ №1:

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

 df.stack(1).reset_index().rename(columns={'level_1': 'Ticker'})
  

Вывод:

       Date Ticker  Adj Close
0  1/11/19      A  80.226730
1  1/11/19    AAL  28.541664
2  1/12/19      A  84.736191
3  1/12/19    AAL  28.574404
4   1/1/20      A  82.177856
5   1/1/20    AAL  26.741179
  

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

1. Ты тоже @Scott 🙂

2. @ShubhamSharma Я получаю «Ошибка индекса: слишком много уровней: индекс имеет только 1 уровень, а не 2», может быть, это потому, что я не продублировал значения индекса для ‘AAL’?

3. @YUragun я предполагаю, что тогда ваш фрейм данных не содержит многоиндексных столбцов.. Можете ли вы показать вывод df.columns ?

4. @YUrangun… Не могли бы вы обновить свой вопрос выводом из df.to_dict() ?

5. Это действительно работает. Я только что сохранял, а затем перезагружал CSV в другом модуле, что вызывает проблемы. Я предполагаю, что что-то меняется, когда оно перезагружается обратно в память. Спасибо вам обоим за вашу помощь и терпение 🙂