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

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

我有一个功能

def cruise_fun(speed, accl, acmx, dcmx):
    count = 0
    index = []
    for i in range(len(speed.dropna())):
        if ((speed[i]>40) & (accl[i]<acmx*0.2) & (accl[i]>dcmx*0.2)):
            count +=1
            index.append(i)
                    
    return count, index

在以下语句中调用此函数

cruise_t_all, index_all =cruise_fun(all_data_speed[0], acc_val_all[0], acc_max_all, decc_max_all)

all_data_speedacc_val_all 是 1 列和 38287 行的两个数据帧。 acc_max_alldecc_max_all 是两个 float64 值。我已尝试尽可能多地实施 Whosebug 中提供的解决方案。 and& 我都用过。我无法解决这个问题。

您使用 pandas 的方式有误。你不应该像你一样遍历所有行。您可以连接提供的列,然后检查条件:

def cruise_fun(speed, accl, acmx, dcmx):
    df = pd.concat([speed.dropna(), accl], axis=1)
    df.columns = ["speed", "accl"]
    mask = (df["speed"] > 40) & df["accl"].between(dcmx * .2, acmx * .2, inclusive=False)
    return mask.sum(), df[mask].index

注意:我做出的一些假设:

  • 我假设您的列名没有冲突,否则 concat 将不起作用,您需要先重命名您的列
  • 我假设 speed.dropna()accl 的索引匹配,但如果不是这样我也不会感到惊讶。您应该确保这很好,或者更好:将所有内容存储在同一个数据框中