通过"df"
列上的条件向现有Pandas DataFrame dfs
添加列(权重)的最pythonic方式是什么?
小例子:
df = pd.DataFrame({'A' : [1, 2, 3], 'B' : [4, 5, 6]})
df
Out[110]:
A B
0 1 4
1 2 5
2 3 6
我想添加一个"体重"列如果df['B'] >= 6
然后df['weight'] = 20
,则为df['weight'] = 1
所以我的输出将是:
A B weight
0 1 4 1
1 2 5 1
2 3 6 20
答案 0 :(得分:4)
您可以使用numpy.where
作为矢量化解决方案:
df['weight'] = np.where(df['B'] >= 6, 20, 1)
结果:
A B weight
0 1 4 1
1 2 5 1
2 3 6 20
答案 1 :(得分:4)
方法#1
这是一个具有类型转换和缩放功能 -
df['weight'] = (df['B'] >= 6)*19+1
方法#2
使用底层数组数据的另一个可能更快的 -
df['weight'] = (df['B'].values >= 6)*19+1
方法#3
利用numexpr
module -
import numexpr as ne
val = df['B'].values
df['weight'] = ne.evaluate('(val >= 6)*19+1')
对于目前为止发布的矢量化方法,500k
行as commented by OP
上的时间为[0,9)
范围内的随机数据
In [149]: np.random.seed(0)
...: df = pd.DataFrame({'B' : np.random.randint(0,9,(500000))})
# @jpp's soln
In [150]: %timeit df['weight1'] = np.where(df['B'] >= 6, 20, 1)
100 loops, best of 3: 3.57 ms per loop
# @jpp's soln with array data
In [151]: %timeit df['weight2'] = np.where(df['B'].values >= 6, 20, 1)
100 loops, best of 3: 3.27 ms per loop
In [154]: %timeit df['weight3'] = (df['B'] >= 6)*19+1
100 loops, best of 3: 2.73 ms per loop
In [155]: %timeit df['weight4'] = (df['B'].values >= 6)*19+1
1000 loops, best of 3: 1.76 ms per loop
In [156]: %%timeit
...: val = df['B'].values
...: df['weight5'] = ne.evaluate('(val >= 6)*19+1')
1000 loops, best of 3: 1.14 ms per loop
最后一个......
输出为1
或20
时,我们可以安全地使用较低的精度:uint8
进行turbo加速比已经讨论的那样,如此 -
In [208]: %timeit df['weight6'] = (df['B'].values >= 6)*np.uint8(19)+1
1000 loops, best of 3: 428 µs per loop
答案 2 :(得分:1)
这是使用df.apply
的方法df['weight'] = df.apply(lambda row: 20 if row['B'] >= 6 else 1, axis=1)
输出:
In [6]: df
Out[6]:
A B weight
0 1 4 1
1 2 5 1
2 3 6 20