通过DF列上的条件向pandas DF添加权重列

时间:2018-04-23 09:33:37

标签: python pandas numpy dataframe

通过"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

3 个答案:

答案 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')
对于目前为止发布的矢量化方法,500kas 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

最后一个......

输出为120时,我们可以安全地使用较低的精度: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