Как восстановить иерархию многоиндексных фреймов данных после read_ sql? - PullRequest
1 голос
/ 23 марта 2020

У меня есть многоиндексный фрейм данных, изначально похожий на этот (извините за формат изображения - подробнее об этом позже):

enter image description here

Это фрейм данных хранится в таблице SQLite. Когда я использую read_sql_query, указав index_col=['id', 'year', 'interval'], я получаю версию фрейма данных, в которой имена столбцов сглажены:

df = pd.DataFrame({"('LSSR.EVI', 'anomaly')": {('102003425432342620301682804267026993600',
   2010,
   15): -1.2427875479709378,
  ('102003425432342620301682804267026993600', 2010, 16): -1.5810953949599622,
  ('102003425432342620301682804267026993600', 2010, 17): -0.21514085140646852,
  ('102003425432342620301682804267026993600', 2010, 18): 2.8447636755956602,
  ('102003425432342620301682804267026993600', 2010, 19): 5.387294849602293},
 "('LSSR.EVI', 'delta')": {('102003425432342620301682804267026993600',
   2010,
   15): -0.08247779546308173,
  ('102003425432342620301682804267026993600', 2010, 16): -0.13964240787494409,
  ('102003425432342620301682804267026993600', 2010, 17): -0.14732367140515223,
  ('102003425432342620301682804267026993600', 2010, 18): -0.048977311394384104,
  ('102003425432342620301682804267026993600', 2010, 19): 0.12874585657790194}})
df.index.rename(['id','year','interval'], inplace=True)

Как видите, два уровня иерархии столбцов были сплющенный - то есть в скобках и разделенный запятой. Причина для изображения выше в том, что я понял, что экспорт фрейма данных с to_dict дает тот же результат, и я не знал, как поделиться им в SO, но, надеюсь, другого df будет достаточно, чтобы решить проблему. Мои вопросы:

  1. Как я могу восстановить иерархию исходного фрейма данных? Я пробовал .unstack(), но, похоже, он как-то работает только на axis=0
  2. Что на самом деле представляет номенклатура ('col1', 'col2') и как получить доступ к различным столбцам? Я перепробовал множество комбинаций df['LSSR.EVI'], df[('LSSR.EVI')], df[('LSSR.EVI', 'anomaly')], но все они возвращают ошибки, и у меня такое ощущение, что я здесь упускаю критический логический шаг.

1 Ответ

1 голос
/ 23 марта 2020

Использование:

import ast

#if strings tuples in columns
df.columns = pd.MultiIndex.from_tuples([ast.literal_eval(x) for x in df.columns])
#if tuples in columns
#df.columns = pd.MultiIndex.from_tuples df.columns.tolist())
print (df)
                                                       LSSR.EVI          
                                                        anomaly     delta
id                                      year interval                    
102003425432342620301682804267026993600 2010 15       -1.242788 -0.082478
                                             16       -1.581095 -0.139642
                                             17       -0.215141 -0.147324
                                             18        2.844764 -0.048977
                                             19        5.387295  0.128746

Теперь можно выбирать столбцы по кортежам:

print (df[('LSSR.EVI', 'anomaly')])
id                                       year  interval
102003425432342620301682804267026993600  2010  15         -1.242788
                                               16         -1.581095
                                               17         -0.215141
                                               18          2.844764
                                               19          5.387295
Name: (LSSR.EVI, anomaly), dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...