如何在 pandas 中将单列除以多列?
How to divide sing column by multiple columns in pandas?
我想将单列除以多列 (Z/A1~A10) 和 return 多列上的值。(A1~A10)
听到的是我的数据框。
ID A1 A2 A3 A4 … A10 Z
1 6 9 3 3 4 3 69
2 8 3 8 3 3 10 85
3 1 2 4 4 7 5 93
4 1 6 6 4 7 5 91
5 6 4 6 8 10 10 79
6 8 10 7 2 7 10 50
7 10 3 4 7 10 2 63
8 4 7 3 7 6 1 91
我的预期输出如下。
ID A1 A2 A3 A4 … A10 Z
1 11.5 7.7 23.0 23.0 17.3 23.0 69
2 10.6 28.3 10.6 28.3 28.3 8.5 85
3 93.0 46.5 23.3 23.3 13.3 18.6 93
4 91.0 15.2 15.2 22.8 13.0 18.2 91
5 13.2 19.8 13.2 9.9 7.9 7.9 79
6 6.3 5.0 7.1 25.0 7.1 5.0 50
7 6.3 21.0 15.8 9.0 6.3 31.5 63
8 22.8 13.0 30.3 13.0 15.2 91.0 91
我已经用这个代码试过了。
list = [A1, A2, A3, ... A10]
df.loc[:, list] = df['Z'] / df[:, list]
但是,A1~A10 列的结果为空白。
我怎样才能为这个任务编写代码?
您可以简单地遍历列并划分:
for col in df.drop('Z',axis=1).columns:
df[col] = df['Z'] / df[col]
df.loc[:, list] = df.loc[:, list].apply(lambda col: df.Z / col)
设置
import pandas as pd
import numpy as np
np.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)
计算
利用 pandas 数据帧基本上只是 numpy 数组这一事实。仅访问您想要对其应用函数的列(这就是 df.loc[:, 'A10']
的用途。请参阅 pandas docs for help on slicing)。
.apply
方法需要一个函数,默认情况下应用于每一列(即一列是输入参数)。这意味着您将列 Z (df['Z']
) 除以 df 中每一列的值(df['A1']
、df['A2']
等...)
正如我提到的,pandas 数据结构建立在 numpy 数组之上。因此,将一个 8 x 1 形状的数组(df['Z']
列)除以另一个 8 x 1 数组(每隔一列),将意味着您将每个元素除以等效元素(Z 中的第一个除以 Z 中的第一个)其他列,第 2 到第 2,第 3 到第 3,等等...)
df.loc[:, 'A10'].apply(lambda col: df['Z'] / col)
我想将单列除以多列 (Z/A1~A10) 和 return 多列上的值。(A1~A10)
听到的是我的数据框。
ID A1 A2 A3 A4 … A10 Z
1 6 9 3 3 4 3 69
2 8 3 8 3 3 10 85
3 1 2 4 4 7 5 93
4 1 6 6 4 7 5 91
5 6 4 6 8 10 10 79
6 8 10 7 2 7 10 50
7 10 3 4 7 10 2 63
8 4 7 3 7 6 1 91
我的预期输出如下。
ID A1 A2 A3 A4 … A10 Z
1 11.5 7.7 23.0 23.0 17.3 23.0 69
2 10.6 28.3 10.6 28.3 28.3 8.5 85
3 93.0 46.5 23.3 23.3 13.3 18.6 93
4 91.0 15.2 15.2 22.8 13.0 18.2 91
5 13.2 19.8 13.2 9.9 7.9 7.9 79
6 6.3 5.0 7.1 25.0 7.1 5.0 50
7 6.3 21.0 15.8 9.0 6.3 31.5 63
8 22.8 13.0 30.3 13.0 15.2 91.0 91
我已经用这个代码试过了。
list = [A1, A2, A3, ... A10]
df.loc[:, list] = df['Z'] / df[:, list]
但是,A1~A10 列的结果为空白。 我怎样才能为这个任务编写代码?
您可以简单地遍历列并划分:
for col in df.drop('Z',axis=1).columns:
df[col] = df['Z'] / df[col]
df.loc[:, list] = df.loc[:, list].apply(lambda col: df.Z / col)
设置
import pandas as pd
import numpy as np
np.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)
计算
利用 pandas 数据帧基本上只是 numpy 数组这一事实。仅访问您想要对其应用函数的列(这就是 df.loc[:, 'A10']
的用途。请参阅 pandas docs for help on slicing)。
.apply
方法需要一个函数,默认情况下应用于每一列(即一列是输入参数)。这意味着您将列 Z (df['Z']
) 除以 df 中每一列的值(df['A1']
、df['A2']
等...)
正如我提到的,pandas 数据结构建立在 numpy 数组之上。因此,将一个 8 x 1 形状的数组(df['Z']
列)除以另一个 8 x 1 数组(每隔一列),将意味着您将每个元素除以等效元素(Z 中的第一个除以 Z 中的第一个)其他列,第 2 到第 2,第 3 到第 3,等等...)
df.loc[:, 'A10'].apply(lambda col: df['Z'] / col)