Python Pandas计算

时间:2018-05-03 14:49:49

标签: python pandas

我正在计算一米的汽车成本。我几乎得到了我想要的结果,但似乎我的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之外,所有结果都是正确的。

我确信这是一种更有效的写作方式,但现在这就是我所拥有的,所以请任何建议或建议都有帮助。

2 个答案:

答案 0 :(得分:0)

在if语句中检查你的情况。

设置为requirements.txt

如果x == True.Ambiguous有任何值,则声明为真。

因此,长话短说,尝试重新定义这个条件。

您还可以尝试在该条件之外定义费用变量,然后将xx进行比较,而不是xTrue进行比较。

答案 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