Reputation: 61
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
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