我正在计算一米的汽车成本。我几乎得到了我想要的结果,但似乎我的if
语句被忽略,只执行我的else
语句。
以下是我的意见:
vehicle = pd.read_csv('file.csv', sep=';')
Zone; rate; Minutes; max time(hr)
5 ; 4.5 ; 2880 ; 2
5 ; 3.5 ; 902 ; 2
5 ; 2.0 ; 1440 ; 2
6 ; 2.0 ; 1440 ; 3
6 ; 3.5 ; 1439 ; 3
6 ; 2.5 ; 630 ; 3
6 ; 2.0 ; 751 ; 3
代码
max_time_mins = vehicle['max time']* 1440
max_rate = 20
x = vehicle['Minutes'] >= max_time_mins
x = str(x)
if x == True:
cost = ((((vehicle['Minutes']%1440)/60)*vehicle['rate'])+ (vehicle['Minutes']/1440) * max_rate)
else:
cost = ((vehicle['Minutes']/60)*vehicle['rate'])
我将max_time_mins
转换为分钟,然后进行比较以查看车辆停放时间Minutes
是否大于或等于您在x中看到的车辆停放的最长时间,因为if Minutes
> = max_time_mins
我想添加额外费用max_rate
得到的即时通讯是:
0 216.000000
1 52.616667
2 48.000000
3 48.000000
4 83.941667
5 26.250000
6 25.033333
除第一个实例产生216之外,所有结果都是正确的。
我确信这是一种更有效的写作方式,但现在这就是我所拥有的,所以请任何建议或建议都有帮助。
答案 0 :(得分:0)
在if语句中检查你的情况。
设置为requirements.txt
。
如果x == True.Ambiguous
有任何值,则声明为真。
因此,长话短说,尝试重新定义这个条件。
您还可以尝试在该条件之外定义费用变量,然后将x
与x
进行比较,而不是x
与True
进行比较。
答案 1 :(得分:0)
在pandas中不需要执行for循环来执行此类操作。这可以使用掩码完成(有关pandas中布尔索引的更多信息,请参阅this page of documentation)。对于沮丧:
max_rate = 20
max_time_mins = vehicle['max time'] * 1440
这个元素乘以1440。也就是说,每一行乘以常数。
x = vehicle['Minutes'] >= max_time_mins
# Output
# 0 True
# 1 False
# 2 False
# 3 False
# 4 False
# 5 False
# 6 False
# dtype: bool
这种比较也是按元素进行的。因此,输出是一个布尔系列,其长度相同,如果该行的元素满足条件,则包含True
,否则为False
。
这就是您尝试执行Truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
时出现错误if x == True:
的原因,因为if语句在元素方面不起作用。
然而,使用布尔索引这个if ... else ...行为可以使用已经定义的掩码和逐元素非运算符~
轻松复制:
cost = pd.Series(np.empty(vehicle.shape[0])) # initialize a Series with the same shape
cost.loc[x] = ((((vehicle['Minutes'][x]%1440)/60)*vehicle['rate'][x])+ (vehicle['Minutes'][x]/1440) * max_rate) # Equivalent to if
cost.loc[~x] = ((vehicle['Minutes'][~x]/60)*vehicle['rate'][~x]) # Equivalent to else
# Output
# 0 40.000000
# 1 52.616667
# 2 48.000000
# 3 48.000000
# 4 83.941667
# 5 26.250000
# 6 25.033333
# dtype: float64
也可以将其作为新列直接添加到原始数据框中:
vehicle.loc[x, 'cost'] = ((((vehicle['Minutes'][x]%1440)/60)*vehicle['rate'][x])+ (vehicle['Minutes'][x]/1440) * max_rate)
# Here vehicle has values in rows where x is true and NaN everywhere else
vehicle.loc[~x, 'cost'] = ((vehicle['Minutes'][~x]/60)*vehicle['rate'][~x])
# The rest of the rows are filled