Python 熊猫中基于值的虚拟变量
我想在pandas中创建一个虚拟变量,如果a列中的值大于0,则该变量的值为1,否则为0。该虚拟对象应存储在新列G中Python 熊猫中基于值的虚拟变量,python,pandas,Python,Pandas,我想在pandas中创建一个虚拟变量,如果a列中的值大于0,则该变量的值为1,否则为0。该虚拟对象应存储在新列G中 A B C D E F 2016-01-01 0.571650 0.427669 0.090381 -0.765132 -1.164994 0.244477 2016-01-02 0.834616 0.938302 -0.428445 -0.06714
A B C D E F
2016-01-01 0.571650 0.427669 0.090381 -0.765132 -1.164994 0.244477
2016-01-02 0.834616 0.938302 -0.428445 -0.067147 0.126845 0.783122
2016-01-03 1.996946 -0.178791 1.478010 0.424868 2.311478 -0.357036
2016-01-04 0.423200 0.229080 1.414170 0.258490 0.931763 0.096947
2016-01-05 -0.400117 -0.785149 1.748607 1.777462 -0.509319 0.314151
目前,我有这个
a = []
for row in df['A']:
if row > 0:
a.append(1)
else:
a.append(0)
df['G'] = a
这是可行的,但我有一种直觉,必须有一种更好、更简单的方法来做到这一点?比较整个专栏,并使用以下方法转换
dtype
:
比较生成一个带有dtype
bool
的布尔系列
:
In [22]:
df['A'] > 0
Out[22]:
2016-01-01 True
2016-01-02 True
2016-01-03 True
2016-01-04 True
2016-01-05 False
Name: A, dtype: bool
因此,将类型强制转换为int
会将True
转换为1
并将False
转换为0
对于50k df:
In [36]:
%%timeit
a=[]
for row in df['A']:
if row > 0:
a.append(1)
else:
a.append(0)
100 loops, best of 3: 15.1 ms per loop
In [37]:
%timeit df['G'] = (df['A'] > 0).astype(int)
1000 loops, best of 3: 423 µs per loop
因此,矢量化版本的速度提高了约35倍,并且可以更好地扩展更大的dfs
In [36]:
%%timeit
a=[]
for row in df['A']:
if row > 0:
a.append(1)
else:
a.append(0)
100 loops, best of 3: 15.1 ms per loop
In [37]:
%timeit df['G'] = (df['A'] > 0).astype(int)
1000 loops, best of 3: 423 µs per loop