Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-如果满足条件,则应用公式_Python_Dataframe_Lambda - Fatal编程技术网

Python-如果满足条件,则应用公式

Python-如果满足条件,则应用公式,python,dataframe,lambda,Python,Dataframe,Lambda,我试图更改数据帧中的值,如果该值以某物开头。 我正在检查前四个值是否为0.00 如果它以0.00开始,我想把这个值乘以100 下面的公式给出了这个错误 ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 我的公式是 Total['Rate']=Total['Rate'].apply(lambda x: Total['Rate']*1

我试图更改数据帧中的值,如果该值以某物开头。 我正在检查前四个值是否为0.00 如果它以0.00开始,我想把这个值乘以100 下面的公式给出了这个错误

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), 
a.item(), a.any() or a.all().
我的公式是

Total['Rate']=Total['Rate'].apply(lambda x: Total['Rate']*100 if \ 
Total['Rate'].str[:4]=='0.00' else Total['Rate'])
改用这个:

Total['Rate']=Total['Rate'].mask(Total['Rate'].str.startswith('0.00'), Total['Rate']*100)

不需要转换为字符串,最好将值乘以
整数
,并与
0
进行比较:

Total = pd.DataFrame(data=[0.001,0.2,5,0.0002],columns=['Rate'])

s = Total['Rate'] * 100
Total['Rate'] = np.where(s.astype(int) == 0, s, Total['Rate'])
print (Total)
   Rate
0  0.10
1  0.20
2  5.00
3  0.02
详细信息

print (s)
0      0.10
1     20.00
2    500.00
3      0.02
Name: Rate, dtype: float64

print (s.astype(int))
0      0
1     20
2    500
3      0
Name: Rate, dtype: int32

print (s.astype(int) == 0)
0     True
1    False
2    False
3     True
Name: Rate, dtype: bool
Total = pd.DataFrame(data=[0.001,0.2,5,0.0002],columns=['Rate'])
Total = pd.concat([Total] * 10000, ignore_index=True)


In [296]: %%timeit
     ...: s = Total['Rate'] * 100
     ...: Total['Rate'] = np.where(s.round() == 0, s, Total['Rate'])
     ...: 
2.09 ms ± 119 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [297]: %%timeit
     ...: Total['Rate'] = Total['Rate'].apply(lambda x: x*100 if str(x)[:4]=='0.00' else x, 1)
     ...: 
26.2 ms ± 1.11 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
性能

print (s)
0      0.10
1     20.00
2    500.00
3      0.02
Name: Rate, dtype: float64

print (s.astype(int))
0      0
1     20
2    500
3      0
Name: Rate, dtype: int32

print (s.astype(int) == 0)
0     True
1    False
2    False
3     True
Name: Rate, dtype: bool
Total = pd.DataFrame(data=[0.001,0.2,5,0.0002],columns=['Rate'])
Total = pd.concat([Total] * 10000, ignore_index=True)


In [296]: %%timeit
     ...: s = Total['Rate'] * 100
     ...: Total['Rate'] = np.where(s.round() == 0, s, Total['Rate'])
     ...: 
2.09 ms ± 119 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [297]: %%timeit
     ...: Total['Rate'] = Total['Rate'].apply(lambda x: x*100 if str(x)[:4]=='0.00' else x, 1)
     ...: 
26.2 ms ± 1.11 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
编辑:如果要将值设置为多个遮罩,例如将负值设置为
0
使用:

Total=pd.DataFrame(数据=[0.001,0.2,5,0.0002,-10],列=['Rate'])
s=总[‘费率’]*100
mask1=s.astype(int)==0
mask2=总[“速率”]<0
总计['Rate']=np。选择([mask1,mask2],[s,0],默认值=总计['Rate'])
打印(总计)
比率
0  0.10
1  0.20
2  5.00
3  0.02
4  0.00

您非常接近,问题是在lambda函数中,您试图将整列相乘,而不仅仅是值

如下图所示,将这些更改为x,您就得到了它

Total['Rate'] = Total['Rate'].apply(lambda x: x*100 if str(x)[:4]=='0.00' else x, 1)

希望这有帮助

你能为你的问题增加一个答案吗?标记
dataframe
-您的意思是
pandas.dataframe
?如果是-相应地用
pandas
标记,那么通过转换为字符串来比较数字的前4个值的原因是什么?我认为这是一个坏主意,因为好的性能只适用于数字。在我看来,解决方案是可行的,但使用像字符串这样的数字有点奇怪,特别是如果它比较慢的话。所以不推荐您的解决方案。@IMiller-在我的答案中添加了多个掩码的解决方案。