Skip to content
Advertisement

Expand Pandas Dataframes adding rows by different ranges

I have a dataframe like this:

SEG FAM GAMA MIN_RAT MAX_RAT VALOR
PE 001 002 1 2 5,15
PE 001 002 2,1 3 2,55

And I need to “expand” the df adding new rows to make a new dataframe like this:

SEG FAM GAMA MIN_RAT MAX_RAT VALOR
PE 001 002 1 1 10,30
PE 001 002 1,1 1,1 9,79
PE 001 002 1,2 1,2 9,27
PE 001 002 1,3 1,3 8,76
PE 001 002 1,4 1,4 8,24
PE 001 002 1,5 1,5 7,73
PE 001 002 1,6 1,6 7,21
PE 001 002 1,7 1,7 6,70
PE 001 002 1,8 1,8 6,18
PE 001 002 1,9 1,9 5,67
PE 001 002 2 2 5,15
PE 001 002 2,1 2,1 5,10
PE 001 002 2,2 2,2 4,82
PE 001 002 2,3 2,3 4,53
PE 001 002 2,4 2,4 4,25
PE 001 002 2,5 2,5 3,97
PE 001 002 2,6 2,6 3,68
PE 001 002 2,7 2,7 3,40
PE 001 002 2,8 2,8 3,12
PE 001 002 2,9 2,9 2,83
PE 001 002 3 3 2,55

The values ​​of the column “VALOR” are constructed dividing :

  • 5.15 of the original table by the number of new rows between MIN_RAT=1 and MAX_RAT = 2 and adding that value to 5.15 (in this case we add 0.515 in each row)

  • 2,55 of the original table by the number of new rows between MIN_RAT=2,1 and MAX_RAT = 3 and adding that value to 2.55 (in this case we add 0.28 in each row)

Is it possible to do this optimally?

Advertisement

Answer

Let’s try this:

rnglist=[np.arange(i, j+.1, 0.1) for i, j in list(zip(df['MIN_RAT'], df['MAX_RAT']))]

dfm = df.reindex(df.index.repeat([len(x) for x in rnglist]))

dfm['MIN_RAT'] = np.concatenate(rnglist)
dfm['MAX_RAT'] = np.concatenate(rnglist)

dfm['VALOR']=  dfm.groupby(level=0)['VALOR']
                  .transform(lambda x: ((x.notna().cumsum()-1)/(x.count()-1)*x.iloc[0])[::-1]+x.iloc[0])
print(dfm)

Output:

   EG  FAM  GAMA  MIN_RAT  MAX_RAT      VALOR
0  PE    1     2      1.0      1.0  10.300000
0  PE    1     2      1.1      1.1   9.785000
0  PE    1     2      1.2      1.2   9.270000
0  PE    1     2      1.3      1.3   8.755000
0  PE    1     2      1.4      1.4   8.240000
0  PE    1     2      1.5      1.5   7.725000
0  PE    1     2      1.6      1.6   7.210000
0  PE    1     2      1.7      1.7   6.695000
0  PE    1     2      1.8      1.8   6.180000
0  PE    1     2      1.9      1.9   5.665000
0  PE    1     2      2.0      2.0   5.150000
1  PE    1     2      2.1      2.1   5.100000
1  PE    1     2      2.2      2.2   4.816667
1  PE    1     2      2.3      2.3   4.533333
1  PE    1     2      2.4      2.4   4.250000
1  PE    1     2      2.5      2.5   3.966667
1  PE    1     2      2.6      2.6   3.683333
1  PE    1     2      2.7      2.7   3.400000
1  PE    1     2      2.8      2.8   3.116667
1  PE    1     2      2.9      2.9   2.833333
1  PE    1     2      3.0      3.0   2.550000
User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement