Как преобразовать кадр данных Pandas в мультииндексный кадр данных - PullRequest
1 голос
/ 16 октября 2019

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

Вот кадр данных:

Date         MMM             ABT             ABBV            ABMD
20171017    -0.004455   0.007810    0.012260    0.011132
20171018    0.002382    0.012731    0.040296    0.002775
20171019    0.004424    0.004107    0.004561    -0.00429
20171020    0.009398    0.005682    -0.003954   0.013801

Я пробовал этот код:

for date in returns.index:

    arrays = [[[date] * len(returns.columns)][0], 
    list(returns.columns)]
    tuples = list(zip(*arrays))
    index = pd.MultiIndex.from_tuples(tuples)
    multi.loc[(date,np.array(index.levels[1])),:] = 
    returns.loc[date,:].values.reshape(-1,1)

однако я получаю следующую ошибку:

TypeError: unhashable type: 'numpy.ndarray'

Я ожидал:

                    Returns
 20171017   MMM  -0.004455
            ABT  0.007810
            ABBV     0.012260
            ABMD     0.011132
            ACN  -0.003173
            ATVI     0.002919
            ADBE     -0.000532
            AMD  -0.007062
            AAP  0.023612
            AES  -0.007149
            AMG  -0.007792
            AFL  -0.005014
            A    -0.011948
            APD  0.001629
            AKAM     -0.002966
            ALK  0.000621

Ответы [ 2 ]

3 голосов
/ 16 октября 2019

Используйте DataFrame.set_index с DataFrame.stack для Series with MultiIndex и при необходимости один столбец DataFrame добавьте Series.to_frame:

df = df.set_index('Date').stack().to_frame('Returns')
print (df)
                Returns
Date                   
20171017 MMM  -0.004455
         ABT   0.007810
         ABBV  0.012260
         ABMD  0.011132
20171018 MMM   0.002382
         ABT   0.012731
         ABBV  0.040296
         ABMD  0.002775
20171019 MMM   0.004424
         ABT   0.004107
         ABBV  0.004561
         ABMD -0.004290
20171020 MMM   0.009398
         ABT   0.005682
         ABBV -0.003954
         ABMD  0.013801
2 голосов
/ 16 октября 2019

Использовать DataFrame.set_index + DataFrame.stack . Затем переименовать серию, используя Series.rename . Окончательно преобразовать в фрейм данных, используя to_frame :

df.set_index('Date').stack().rename('returns').to_frame()

                returns
Date                   
20171017 MMM  -0.004455
         ABT   0.007810
         ABBV  0.012260
         ABMD  0.011132
20171018 MMM   0.002382
         ABT   0.012731
         ABBV  0.040296
         ABMD  0.002775
20171019 MMM   0.004424
         ABT   0.004107
         ABBV  0.004561
         ABMD -0.004290
20171020 MMM   0.009398
         ABT   0.005682
         ABBV -0.003954
         ABMD  0.013801
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...