如何在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
答案 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
的另一种解决方案
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);
当df['new'] = df.column1.gt(W1).add(1).add(df.column1.gt(W2))
df
大于column1
时,我们得到W1
。小于等于True
。当我添加False
时,这些布尔值将分别转换为整数值1
和1
。因此0
和2
的结果为1
和True
(因为我添加了1)。因此,截至目前,我False
小于或等于1
,W1
大于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