akkab
akkab

Reputation: 401

Divide row values in a pandas DataFrame by a specific column

I have a dataframe which looks like this:

                1     2     3     4  Density
Mineral                                     
Quartz       13.4  23.0  23.4  28.3    2.648
Plagioclase   5.2   8.2   8.5  11.7    2.620
K-feldspar    2.3   2.4   2.6   3.1    2.750

What I need to do is to calculate the new rows based on the condition made on the row:

DESIRED OUTPUT

                 1     2     3     4     Density 
Mineral                                                           
Quartz         13.4  23.0  23.4  28.3    2.648
Plagioclase     5.2   8.2   8.5  11.7    2.620
K-feldspar      2.3   2.4   2.6   3.1    2.750
Quartz_v       5.06  8.69  8.84 10.69    2.648
Plagioclase_v   ...

So the process is basically I need to the following steps:

1) Define the new row, for example, Quartz_v

2) and then perform the following calculation Quartz_v = each column value of Quartz divided by the Density value of Quartz_v

I have already loaded the data as a two dataframes, the density and mineral ones, and merged them, so the each mineral will have the correct density in front of it.

Upvotes: 0

Views: 3027

Answers (1)

cs95
cs95

Reputation: 402413

Use

  • DataFrame.div with axis=0 to perform division,
  • rename to rename the index, and
  • append to concatenate the result to the original (you can also use pd.concat instead).

d = df['Density']
result = df.append(df.div(d, axis=0).assign(Density=d).rename(lambda x: x+'_v'))
result

                       1          2          3          4  Density
Mineral                                                           
Quartz         13.400000  23.000000  23.400000  28.300000    2.648
Plagioclase     5.200000   8.200000   8.500000  11.700000    2.620
K-feldspar      2.300000   2.400000   2.600000   3.100000    2.750
Quartz_v        5.060423   8.685801   8.836858  10.687311    2.648
Plagioclase_v   1.984733   3.129771   3.244275   4.465649    2.620
K-feldspar_v    0.836364   0.872727   0.945455   1.127273    2.750

Upvotes: 3

Related Questions