Python 使用Pandas基于另一列的值创建列 请考虑这个数据帧: date value ------------------- 20201001 -100 20200202 200 20200303 0 ...

Python 使用Pandas基于另一列的值创建列 请考虑这个数据帧: date value ------------------- 20201001 -100 20200202 200 20200303 0 ...,python,python-3.x,pandas,Python,Python 3.x,Pandas,我想有另一个非常简单的专栏:“状态” 如果值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)我以这种方

我想有另一个非常简单的专栏:“状态”

如果值<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
使用:

如果只有整数使用:

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

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)   
使用:

如果只有整数使用:

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

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)   

谢谢如果没有
numpy
,有什么办法吗?@Arian-那么可以使用
clip
感谢它的工作。但我想知道我的代码出了什么问题?为什么我不能这样写条件?Thanks@Arian-如果需要多个
的性能,如果else
最好使用,但是对于
-1,0,1
最好
np。请在此处签名
。老实说,我想知道我的代码中出现错误的地方是什么?谢谢。如果没有
numpy
,有什么办法吗?@Arian-那么可以使用
clip
感谢它的工作。但我想知道我的代码出了什么问题?为什么我不能这样写条件?Thanks@Arian-如果需要多个
的性能,如果else
最好使用,但是对于
-1,0,1
最好
np。请在此处签名
,老实说,我想知道我的代码有什么错误导致错误?