Devil
Devil

Reputation: 61

How to make rectangle dataframe to TRIANGLE dataframe?

I've dataframe DF1 :


             DP1       DP2       DP3       DP4       DP5       DP6       DP7       DP8    DP9
    OP8   0.693521  1.648789 -0.136742  0.879296  0.543789 -0.911603  0.686688  0.648148  NaN 
    OP10  0.197277  1.648789 -0.136742  0.879296  0.543789 -0.911603  0.686688  0.648148  NaN 
    OP5  -1.541781  0.690276 -0.682243  0.005062  0.543789 -0.911603  0.686688  0.648148  NaN 
    OP3   1.290664 -0.179395  0.006131  0.851467 -1.142673  0.762150  0.686688  0.648148  NaN 
    OP7  -0.942493  0.765121 -0.136742  0.879296  0.543789 -0.911603  0.686688  0.648148  NaN 
    OP2   0.029633  0.046765  0.631446 -0.609291 -0.322024  0.943548  0.348351  0.648148  NaN 
    OP4   1.501141 -1.229722  1.838385 -1.596967 -0.282486 -0.911603  0.686688  0.648148  NaN 
    OP1  -0.519549 -1.118106 -1.150978  0.773364  1.492468 -0.854160 -1.196905 -0.756595  NaN 
    OP6  -0.196714 -0.664541 -0.635718  0.879296  0.543789 -0.911603  0.686688  0.648148  NaN 
    OP9   0.197277  1.648789 -0.136742  0.879296  0.543789 -0.911603  0.686688  0.648148  NaN 

I've this rectangular dataframe(DF1) and i want to make it in triangle dataframe(DF2) :


         DP1       DP2       DP3       DP4       DP5       DP6       DP7       DP8    DP9
    OP8   0.693521  1.648789 -0.136742  0.879296  0.543789 -0.911603  0.686688  0.648148  NaN 
    OP10  0.197277  1.648789 -0.136742  0.879296  0.543789 -0.911603  0.686688  0.648148  NaN 
    OP5  -1.541781  0.690276 -0.682243  0.005062  0.543789 -0.911603  0.686688    NaN     NaN 
    OP3   1.290664 -0.179395  0.006131  0.851467 -1.142673  0.762150    NaN       NaN     NaN 
    OP7  -0.942493  0.765121 -0.136742  0.879296  0.543789   NaN        NaN       NaN     NaN 
    OP2   0.029633  0.046765  0.631446 -0.609291   NaN       NaN        NaN       NaN     NaN 
    OP4   1.501141 -1.229722  1.838385   NaN       NaN       NaN        NaN       NaN     NaN 
    OP1  -0.519549 -1.118106   NaN       NaN       NaN       NaN        NaN       NaN     NaN 
    OP6  -0.196714   NaN       NaN       NaN       NaN       NaN        NaN       NaN     NaN 
    OP9   NaN        NaN       NaN       NaN       NaN       NaN        NaN       NaN     NaN 

To make a triangle dataframe i have used this code:

import chainladder as cl
triangle = cl.Triangle(DF2)

Upvotes: 0

Views: 201

Answers (1)

Edo
Edo

Reputation: 7818

You can try this way. Create a bool mask with numpy, flip it and then assign np.nan.

import numpy as np

# Create a matrix of 1 with the same shape of df.
# Set it to bool so to have a matrix of Trues
mask = np.ones(df.shape, dtype = 'bool')

# Assign False to the lower triangle of the matrix
mask[np.triu_indices(n = df.shape[0], k = 0, m = df.shape[1])] = False

# Flip the mask horizontally
mask = mask[:, ::-1]

# Now the mask will have Trues over the values you don't want to keep
# and False over the values you want to keep
# Assign np.nan [NaN] where the mask is True.
df[mask] = np.nan
print(df)

               DP1       DP2       DP3  ...       DP7       DP8     DP9
    OP8   0.693521  1.648789 -0.136742  ...  0.686688  0.648148    NaN 
    OP10  0.197277  1.648789 -0.136742  ...  0.686688  0.648148     NaN
    OP5  -1.541781  0.690276 -0.682243  ...  0.686688       NaN     NaN
    OP3   1.290664 -0.179395  0.006131  ...       NaN       NaN     NaN
    OP7  -0.942493  0.765121 -0.136742  ...       NaN       NaN     NaN
    OP2   0.029633  0.046765  0.631446  ...       NaN       NaN     NaN
    OP4   1.501141 -1.229722  1.838385  ...       NaN       NaN     NaN
    OP1  -0.519549 -1.118106       NaN  ...       NaN       NaN     NaN
    OP6  -0.196714       NaN       NaN  ...       NaN       NaN     NaN
    OP9        NaN       NaN       NaN  ...       NaN       NaN     NaN

[10 rows x 9 columns]

Upvotes: 1

Related Questions