Python - 基于行值的乘法

时间:2017-05-16 22:51:03

标签: python pandas conditional

我有一个数据框和三个变量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

有任何快速方法吗?

4 个答案:

答案 0 :(得分:5)

创建一个字典,将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

答案 1 :(得分:3)

您可以使用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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

#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