添加一个新列,并根据python中定义的intervall插入特定值

时间:2016-11-23 16:32:40

标签: python pandas numpy

如何在pandas数据框中添加新列并为所有值插入1< = W1,2为所有值< = W2插入,3为所有值> W2?

W1=3
W2=6

这是我的例子:

column1 number   
2       1
1       1
5       2
6       2
7       3
8       3
3       1

3 个答案:

答案 0 :(得分:6)

您可以加倍numpy.where

W1=3
W2=6

df['d'] = np.where(df['column1'] <= W1, 1, 
          np.where(df['column1'] <= W2, 2, 3))
print (df)
   column1  number  d
0        2       1  1
1        1       1  1
2        5       2  2
3        6       2  2
4        7       3  3
5        8       3  3
6        3       1  1

cutdocs

的另一种解决方案
bins = [-np.inf, W1, W2, np.inf]
labels=[1,2,3]
df['d1'] = pd.cut(df['column1'], bins=bins, labels=labels)
print (df)

   column1  number  d d1
0        2       1  1  1
1        1       1  1  1
2        5       2  2  2
3        6       2  2  2
4        7       3  3  3
5        8       3  3  3
6        3       1  1  1

答案 1 :(得分:5)

var newrange = worksheet.getCell(0, 0).getResizedRange(5, 5);

enter image description here

df['new'] = df.column1.gt(W1).add(1).add(df.column1.gt(W2)) df 大于column1时,我们得到W1。小于等于True。当我添加False时,这些布尔值将分别转换为整数值11。因此02的结果为1True(因为我添加了1)。因此,截至目前,我False小于或等于1W1大于2。我通过添加W1大于column1时的布尔序列来完成它,如果小于或等于W2则添加0并将W2添加到1 2大于column1时的W2

我可以这样展示,让它更明显地做什么

c = df.column1
(c > W1) + 1 + (c > W2)

0    1
1    1
2    2
3    2
4    3
5    3
6    1
Name: column1, dtype: int64

答案 2 :(得分:5)

以下是使用np.searchsorted -

的方法
df['out'] = np.searchsorted([W1,W2],df.column1)+1

运行时测试 -

In [230]: df = pd.DataFrame(np.random.randint(0,10,(10000)),columns=[['column1']])

In [231]: W1,W2 = 3,6

In [232]: %timeit np.where(df['column1'] <= W1, 1,np.where(df['column1'] <= W2, 2, 3))
1000 loops, best of 3: 633 µs per loop # @jezrael's soln

In [233]: %timeit df.column1.gt(W1).add(1).add(df.column1.gt(W2))
1000 loops, best of 3: 1.07 ms per loop # @piRSquared's soln

In [234]: %timeit np.searchsorted([W1,W2],df.column1)+1
1000 loops, best of 3: 205 µs per loop # Using np.searchsorted

使用df.column1.values,以便np.searchsorted与NumPy阵列配合使用以进一步提升 -

In [235]: %timeit np.searchsorted([W1,W2],df.column1.values)+1
1000 loops, best of 3: 184 µs per loop