我有一个数据框和三个变量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
有任何快速方法吗?
答案 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