'Divide several columns by several other columns in Pandas
I have a dataset with 20 columns where I want to divide the first 10 by the last 10.
Here are some columns and rows of my dataset:
dict = {'X_1': {'A': 5, 'B': 27, 'C': 26, 'D': 71},
'X_2': {'A': 6, 'B': 51, 'C': 173, 'D': 183},
'Y_1': {'A': 479, 'B': 298, 'C': 598, 'D': 693},
'Y_2': {'A': 964, 'B': 474, 'C': 1854, 'D': 1855}
}
df = pd.DataFrame(dict)
Output:
X_1 X_2 Y_1 Y_2
A 5 6 479 964
B 27 51 298 474
C 26 173 598 1854
D 71 183 693 1855
I could just do it manually,
df["Z_1"] = df["X_1"] / df["Y_1"]
...
df["Z_n"] = df["X_n"] / df["Y_n"]
but I suspect there's a better solution to this.
Any suggestions?
Solution 1:[1]
Use .iloc[] indexing to slice your columns by number...
for i in range(10):
df.iloc[:,i] / df.iloc[:,10+i]
... then you can form the entire resulting dataframe with a generator expression:
pd.concat((df.iloc[:,i] / df.iloc[:,10+i] for i in range(10)), axis=1)
(There might be a shorter pandas way but I'm not aware of it).
Solution 2:[2]
Convert columns to MultiIndex and divide:
temp = df.copy()
temp.columns = temp.columns.str.split("_", expand=True)
temp
X Y
1 2 1 2
A 5 6 479 964
B 27 51 298 474
C 26 173 598 1854
D 71 183 693 1855
Divide X by Y :
temp = temp.X.div(temp.Y).add_prefix("Z_")
temp
Z_1 Z_2
A 0.010438 0.006224
B 0.090604 0.107595
C 0.043478 0.093312
D 0.102453 0.098652
Assign new values to original dataframe:
df.assign(**temp)
X_1 X_2 Y_1 Y_2 Z_1 Z_2
A 5 6 479 964 0.010438 0.006224
B 27 51 298 474 0.090604 0.107595
C 26 173 598 1854 0.043478 0.093312
D 71 183 693 1855 0.102453 0.098652
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | sammywemmy |
