Python - 基于行值的乘法

Python - multiplication based on row values

我有一个数据框和三个变量 x、y、z。

x = 10, y = 20, z = 30

df = pd.DataFrame({'A':['a','b','c'],
                   'B':[6,7,8]})

这是我想要做的:

创建一个新列'C':

If df['A'] == 'a', df['C'] = df['B']*x
If df['A'] == 'b', df['C'] = df['B']*y
If df['A'] == 'c', df['C'] = df['B']*z

有什么快速的方法吗?

您可以使用np.where

df['C'] = np.where(df.A == 'a', df.B*x, np.where(df.A == 'b', df.B*y, df.B*z))

你得到

    A   B   C
0   a   6   60
1   b   7   140
2   c   8   240

创建一个将 A 列值映射到乘法值的字典,然后在 A 列上使用 map 并将其与 B 列相乘:

mul_map = {'a': 10, 'b': 20, 'c': 30}
df['C'] = df['B'] * df['A'].map(mul_map)

结果输出:

   A  B    C
0  a  6   60
1  b  7  140
2  c  8  240

在我看来更具可读性(尽管速度较慢):

df.loc[df['A'] == 'a', 'C'] = df['B']*x
df.loc[df['A'] == 'b', 'C'] = df['B']*y
df.loc[df['A'] == 'c', 'C'] = df['B']*z

迄今为止最快的解决方案。

#use apply to compare df.A with a,b,c and choose x,y or z.
df.apply(lambda r: r.B*[x,y,z][['a','b','c'].index(r.A)], axis=1)
Out[438]: 
0     60
1    140
2    240
dtype: int64

速度测试

%timeit df.apply(lambda r: r.B*[x,y,z][['a','b','c'].index(r.A)], axis=1)
1000 loops, best of 3: 580 µs per loop

%timeit np.where(df.A == 'a', df.B*x, np.where(df.A == 'b', df.B*y, df.B*z))
1000 loops, best of 3: 932 µs per loop

%timeit df['B'] * df['A'].map(mul_map)
1000 loops, best of 3: 686 µs per loop