如何在 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)