3

I have time series pandas dataframe which i would like to transform to a multiindex dataframe with one column.

Here is the dataframe:

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

I tried this code:

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)

however i get the following error :

TypeError: unhashable type: 'numpy.ndarray'

I expected to have:

                    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 Answers 2

7

Use DataFrame.set_index with DataFrame.stack for Series with MultiIndex and if necessary one column DataFrame add 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
Sign up to request clarification or add additional context in comments.

Comments

3

Use DataFrame.set_index + DataFrame.stack.Then rename the serie using Series.rename.Finally convert to dataframe using 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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.