как установить несколько столбцов в качестве индекса в пандах - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть следующие данные:

            Adj Close  year  month  day    pc_day  
Date                                               
1989-01-03   1.164242  1989      1    3       NaN  
1989-01-04   1.211100  1989      1    4  0.333333  
1989-01-05   1.218310  1989      1    5  0.250000  
1989-01-06   1.229123  1989      1    6  0.200000  
1989-01-09   1.239936  1989      1    9  0.500000  
...               ...   ...    ...  ...       ...  
2007-12-24  24.785059  2007     12   24  0.142857  
2007-12-26  24.803761  2007     12   26  0.083333  
2007-12-27  24.756376  2007     12   27  0.038462  
2007-12-28  24.913471  2007     12   28  0.037037  
2007-12-31  24.695290  2007     12   31  0.107143  

[4790 rows x 10 columns]

Для иерархической индексации я должен установить 2 столбца в качестве индекса, Date и month. Дата уже является указателем даты и времени, но я хочу добавить к ней месяц.

Для этого я добавил следующий код:

data.set_index(['Date','month'], drop=False)

Я получил следующую ошибку:

KeyError: "None of ['Date'] are in the columns"

Я использовал print(data.reset_index().set_index(['month','Date'], drop=False, inplace=True)) в соответствии с рекомендациями @null, но на выходе получилось none

Ответы [ 3 ]

1 голос
/ 03 ноября 2019

Вам не нужно использовать DataFrame.reset_index. Вам нужно только DataFrame.set_index с append=True:

data.set_index('month',append=True,inplace=True)

или

data = data.set_index('month',append=True)

Если вам позже потребуетсяпоменяйте местами индексы: DataFrame.swaplevel:

data = data.set_index('month',append=True).swaplevel('Month','Date)
0 голосов
/ 03 ноября 2019

Начиная с ваших данных, 'Дата', не заданная в качестве индекса

Чтобы установить мультииндексный фрейм данных для ваших данных:

data['Date'] = pd.to_datetime(data['Date'])

data.set_index(['Date', 'month'], inplace=True)

вы должны получить

                Adj Close   year    day     pc_day
Date    month               
1989-01-03  1   1.164242    1989    3   0.000000
1989-01-04  1   1.211100    1989    4   0.333333
1989-01-05  1   1.218310    1989    5   0.250000
1989-01-06  1   1.229123    1989    6   0.200000
1989-01-09  1   1.239936    1989    9   0.500000
2007-12-24  12  24.785059   2007    24  0.142857
2007-12-26  12  24.803761   2007    26  0.083333
2007-12-27  12  24.756376   2007    27  0.038462
2007-12-28  12  24.913471   2007    28  0.037037
2007-12-31  12  24.695290   2007    31  0.107143

, а индекс показывает как

data.index

, должно возвращаться

MultiIndex([('1989-01-03',  1),
        ('1989-01-04',  1),
        ('1989-01-05',  1),
        ('1989-01-06',  1),
        ('1989-01-09',  1),
        ('2007-12-24', 12),
        ('2007-12-26', 12),
        ('2007-12-27', 12),
        ('2007-12-28', 12),
        ('2007-12-31', 12)],
       names=['Date', 'month'])
0 голосов
/ 03 ноября 2019

Как определено здесь в документации. set_index метод принимает ключи в качестве аргумента, где

keys: метка или массив, или список меток / массивов. Этот параметр может быть либо одним ключом столбца, либо одним массивом одинаковой длины. как вызывающий DataFrame или список, содержащий произвольную комбинацию ключей столбцов и массивов. Здесь «массив» охватывает Series, Index, np.ndarray и экземпляры Iterator.

Таким образом, это должно быть имя столбца или список имен столбцов.

Простопросто попробуйте:

data.reset_index().set_index(['Date', 'month'], drop=False, inplace=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...