迭代和更新列值时出现ValueError

时间:2019-05-23 14:10:07

标签: python python-3.x pandas

我有两个具有相同列名的数据框,需要同时遍历两个数据框,以查看是否存在任何重叠以及是否存在日期重叠,如果是,请更新数据框的其中一列,与内部循环相关联。

我目前能够确定是否存在重叠,但无法更新该值并获取ValueError。

apr19_copy

cmdb    type            begin                end             duration   
xyz Planned Outage  2019-03-31 09:45:00 2019-03-31 11:27:00   12291 
xyz Planned Outage  2019-04-20 07:25:00 2019-04-22 10:50:00  185100 

apr19

cmdb type           begin             end           duration    
xyz Outage  2019-04-30 15:20:00 2019-05-01 00:17:00   32279 
xyz Outage  2019-04-20 21:42:00 2019-04-20 21:43:00      60  

我尝试使用itertuples,iterrows等都无济于事。

from datetime import datetime
from collections import namedtuple
Range = namedtuple('Range', ['begin', 'end'])

for item in apr19_copy.itertuples():
    r1 = Range(begin = item.begin, end = item.end)
    for item_outage in apr19.itertuples():
        r2 = Range(begin = item_outage.begin,  end = item_outage.end)
        latest_start = max(r1.begin,  r2.begin)
        earliest_end = min(r1.end,  r2.end)
        if(latest_start > earliest_end):
            continue
        diff = (earliest_end - latest_start).seconds + 1
        overlap = max(0, diff)
        print(item_outage.duration)
        apr19.set_value(item_outage.index, 'duration',  item_outage.duration 
                                                        - overlap)

运行以上代码段后,我希望apr19数据帧第二行中的持续时间设置为0。结果数据帧应如下所示(请注意*期望值附近)

apr19

cmdb type           begin             end           duration    
xyz Outage  2019-04-30 15:20:00 2019-05-01 00:17:00   32279 
xyz Outage  2019-04-20 21:42:00 2019-04-20 21:43:00      *0*     

但是我得到

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

1 个答案:

答案 0 :(得分:0)

该错误是由item_outage.index引起的。它是从itertuples获得的,而index表示其上的方法。要获取该行的索引,必须使用Index。所以你应该使用:

    apr19.set_value(item_outage.Index, 'duration',  item_outage.duration 
                                                    - overlap)

但是我的熊猫版本给我使用set_value的弃用警告,所以恕我直言,这应该更好(如果您的熊猫版本接受):

    apr19.at[item_outage.Index, 'duration'] = item_outage.duration - overlap

可以,但是值不是预期的0,而是-1 ...