微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-基于值的熊猫中的虚拟变量

我想在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.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

这行得通,但是我有直觉,必须有一种更好,更简单的方法来做到这一点?

解决方法:

比较整个列并使用astype强制转换dtype:

In [21]:
df['G'] = (df['A'] > 0).astype(int)
df

Out[21]:
                   A         B         C         D         E         F  G
2016-01-01  0.571650  0.427669  0.090381 -0.765132 -1.164994  0.244477  1
2016-01-02  0.834616  0.938302 -0.428445 -0.067147  0.126845  0.783122  1
2016-01-03  1.996946 -0.178791  1.478010  0.424868  2.311478 -0.357036  1
2016-01-04  0.423200  0.229080  1.414170  0.258490  0.931763  0.096947  1
2016-01-05 -0.400117 -0.785149  1.748607  1.777462 -0.509319  0.314151  0

比较生成带有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下可以更好地扩展

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐