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