为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Pandas 根据另一列的值创建一列

使用 Pandas 根据另一列的值创建一列

MYYA 2023-08-22 10:22:43
请考虑这个数据框:date         value      -------------------20201001      -10020200202      20020200303       0...我想要另一个非常简单的专栏:“状态”如果值 < 0 则“状态”= -1如果值 > 0 则“状态”= 1如果值 = 0 则“状态”= 0我写了这段代码:data['Status'] = (data['Value'] / math.fabs(data['Value'])) if data['Value'] != 0 else 0但我得到了这个错误:ValueError:系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。如何在没有For循环的情况下创建此列。谢谢编辑1)我用这种方式编写了代码,但出现了同样的错误:data['Status'] = (data['Value'] / math.fabs(data['Value'])) if data[data['Value'] != 0] else 0
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

用途numpy.sign

data['Status'] = np.sign(data['Value'])

如果仅使用整数Series.clip

data['Status'] = data['Value'].clip(lower=-1, upper=1)

您使用列表理解的解决方案:


data['Status'] = [x / math.fabs(x) if x != 0 else 0 for x in data['Value']]

print (data)

       date  value  Status

0  20201001   -100    -1.0

1  20200202    200     1.0

2  20200303      0     0.0

性能:


#300k rows

data = pd.concat([data] * 100000, ignore_index=True)


In [72]: %timeit data['Status'] = np.sign(data['Value'])

3.2 ms ± 57.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


In [73]: %timeit data['Status'] = data['Value'].clip(lower=-1, upper=1)

5.99 ms ± 49.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


In [74]: %timeit data['Status'] = [x / math.fabs(x) if x != 0 else 0 for x in data['Value']]

144 ms ± 483 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)   


查看完整回答
反对 回复 2023-08-22
  • 1 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信