Pandas - 将值转换为1和0的快速方法

Jef*_*ist 2 python pandas

我有一个数据帧"df":

   x
0 -2
1  2
2 -4
3  2
4  9
5 -2
Run Code Online (Sandbox Code Playgroud)

我试图找到一种快速创建新列df ['binary']的方法,其中df ['x']中的所有正值都输入为1,而df ['x']中的负值输入为0在新的df ['binary']列中.真实的框架非常大,所以我试图用速度来做这件事.任何帮助赞赏.

谢谢

piR*_*red 5

assign + gt

df.assign(binary=df.x.gt(0) * 1)

   x  binary
0 -2       0
1  2       1
2 -4       0
3  2       1
4  9       1
5 -2       0
Run Code Online (Sandbox Code Playgroud)

如果速度是你的追求

df['binary'] = (df.x.values > 0).astype(np.uint8)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


mtd*_*mtd 5

@ piRSquared的答案很好 - 您可以找到一些方法来加快速度:

$ ipython
In [1]: import numpy as np, pandas as pd
In [2]: df = pd.DataFrame({'x': np.random.random(1000000) - 0.5})
In [3]: %timeit df['binary'] = df['x'].gt(0).astype(np.short)
1000 loops, best of 3: 1.74 ms per loop
In [4]: %timeit df['binary'] = df['x'].gt(0).astype(np.short)
1000 loops, best of 3: 1.78 ms per loop
Run Code Online (Sandbox Code Playgroud)

比我更快:

$ ipython
In [1]: import numpy as np, pandas as pd
In [2]: df = pd.DataFrame({'x': np.random.random(1000000) - 0.5})
In [3]: %timeit df.assign(binary=df.x.gt(0)*1)
100 loops, best of 3: 5.48 ms per loop
In [4]: %timeit df.assign(binary=df.x.gt(0)*1)
100 loops, best of 3: 5.54 ms per loop
Run Code Online (Sandbox Code Playgroud)