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

请考虑这个数据框:


date         value      

-------------------

20201001      -100

20200202      200

20200303       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


MYYA
浏览 81回答 1
1回答

qq_笑_17

用途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  Status0  20201001   -100    -1.01  20200202    200     1.02  20200303      0     0.0性能:#300k rowsdata = 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)   
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python