﻿ Divide All Columns by the Value from the 2Nd Column - Apply for All Rows - ITCodar

# Divide All Columns by the Value from the 2Nd Column - Apply for All Rows

## Divide all columns by the value from the 2nd column - apply for all rows

We can make the lengths equal by replicating the second column and then divide by the subset of dataset that doesn't have the first or second column

``df1[-(1:2)] <- df1[-(1:2)]/df1[,2][row(df1[-(1:2)])]df1#       Name        Col      dKO1      dKO2      sdi1#29      Mark 1769380098 0.8674967 0.9201740 0.8735108#30    Anders 1444462500 1.2425947 1.2336649 1.2105541#1278     Tom 1499146688 1.5293111 1.1068905 1.1640133#1295     Vin 1276309375 0.6705163 0.5807531 1.2195172#1296  Marcel   22279500 0.9836621 1.8511187       NaN#1297    Tyta 3114023471 0.9813868 0.9098608 1.1405553#1298   Gerta 2961012500 1.2097011 1.2412815 1.0496874#1307   Moses 3978937424 0.9467125 0.9029171 0.9344295#1642    Hank 1703925000 1.1991725 0.9310929 0.8100584#1674    Rita 1838885550 1.1614969 1.0520367 1.2059076#1754 Margary 1483386250 0.9990865 0.9891363 0.6922093``

## Divide multiple columns by another column in pandas

I believe `df[['B','C']].div(df.A, axis=0)` and `df.iloc[:,1:].div(df.A, axis=0)` work.

## How to divide sing column by multiple columns in pandas?

Setup

``import pandas as pdimport numpy as npnp.random.seed(0)cols = ['A' + str(n) for n in range(1,11)]df = pd.DataFrame(    np.random.randint(0,10, (8,10)),    columns=cols)df['Z'] = np.random.randint(0,70, 8)``

Compute

Leverage the fact that pandas dataframes are basically just numpy arrays. Access only the columns you want to apply a function on (that's what the `df.loc[:, 'A10']` was for. See pandas docs for help on slicing).

the `.apply` method needs a function and by default is applied to each column (i.e. a column is the input argument). This means that you're dividing the column Z (`df['Z']`) by the values of every column in df (`df['A1']`, `df['A2']`, etc...)

as I mentioned, pandas data structures are built on top of numpy arrays. So dividing an 8 x 1 shaped array (the `df['Z']` column) by another 8 x 1 array (every other column), will mean you will be dividing each element by the equivalent element (first in Z divided by first in the other column, 2nd to 2nd, 3rd to 3rd, etc...)

``df.loc[:, 'A10'].apply(lambda col: df['Z'] / col)``

## Divide all columns of a dataframe by a smaller one by key without merging

You can use `set_index`:

``df2.set_index('ID.').div(df1.set_index('ID.')['denominator'], axis=0)``

## Divide a value in a Dataframe column with the previous value in the same column

Use `Series.shift` instead of `apply`:

``df['D'] = df['C'] / df['C'].shift()# index  A  B  C         D# 0      3  2  5       NaN# 1      4  7  6  1.200000# 2      2  4  8  1.333333``

Optionally chain `Series.fillna` if you want 0 instead of NaN:

``df['D'] = df['C'].div(df['C'].shift()).fillna(0)# index  A  B  C         D# 0      3  2  5  0.000000# 1      4  7  6  1.200000# 2      2  4  8  1.333333``

## [pandas]Dividing all elements of columns in df with elements in another column (Same df)

Apologies in advance for the somewhat protracted answer, but the question is somewhat unclear with regards to what exactly you're attempting to accomplish.

If you simply want price/share, price/share, etc. you can just do:

``dftest['price_div_share'] = dftest['price'] / dftest['share']``

The issue with the operand types can be solved by:

``dftest['price_div_share'] = dftest['price'].astype(float) / dftest['share'].astype(float)``

You're getting the `cant convert from str to float` error because you're trying to call `astype(float)` on the ENTIRE dataframe which contains string columns.

If you want to divide each item by each item, i.e. price / share, price / share, price / share, price / share, etc. You would need to iterate through each item and append the result to a new list. You can do that pretty easily with a for loop, although it may take some time if you're working with a large dataset. It would look something like this if you simply want the result:

``new_list = []for p in dftest['price'].astype(float):    for s in dftest['share'].astype(float):        new_list.append(p/s)``

If you want to get this in a new dataframe you can simply save it to a new dataframe using pd.Dataframe() method:

``new_df = pd.Dataframe(new_list, columns=[price_divided_by_share])``

This new dataframe would only have one column (the result, as mentioned above). If you want the information from the original dataframe as well, then you would do something like the following:

``new_list = []for n, a, p in zip(dftest['name'], dftest['age'], dftest['price'].astype(float):    for s in dftest['share'].astype(float):        new_list.append([n, a, p, s, p/s])new_df = pd.Dataframe(new_list, columns=[name, age, price, share, price_div_by_share])``

## Using column-wise operations in dplyr to divide multiple column values by a specified row

`across` should be closed after the `.fns`

``library(dplyr)df_pre %>%   mutate(across(starts_with("q_"), ~ .x / .x[name == "max"]))``

-output

``# A tibble: 3 x 3  name    q_1   q_2  <chr> <dbl> <dbl>1 max     1    1   2 a       0.8  0.5 3 b       0.6  0.25``

The usage of `?across` is

across(.cols = everything(), .fns = NULL, ..., .names = NULL)