比较两列时出现值错误

时间:2020-01-03 11:41:37

标签: python pandas dataframe boolean

我正在尝试将特定列的值与列之一进行比较,并根据它们的比较索引将结果存储到新列中,例如:如果值相差超过10%,则为低,否则为OK。

df["Index"] = ""
def function(df):
    for i in range(1, len(df.columns)-2):
        if((df.columns.values[1]) == (df.columns.values[i+1])):
            if((df.iloc[:,1]) < (0.9 * df.iloc[:,i+1])):
                df["Index"] = "Low"
            else:
                df["Index"] = "OK"
function(df)

什么是

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

对此?如果有人也可以建议使用相同代码结构降低时间复杂度的方法,那就太好了。

2 个答案:

答案 0 :(得分:1)

是否要针对年龄之后的任何列检查年龄?如果其中之一减少了90%,则结果为“确定”?我不确定您需要的逻辑是吗?

df = pd.DataFrame({'char':['A', 'B', 'C', 'D'],'Age':[20, 21, 19, 18],'Age1':[29, 27, 25, 26],'Age2':[60, 48, 55, 62], 'Age3':[60, 48, 55, 62],'Age4':[60, 48, 55, 62],'Age5':[18, 19, 17, 12]})

df["Index"] = ""

def function(df):
    for i in range(1, len(df.columns)-2):
        df['Index'] = np.where(df.iloc[:, 1] < 0.9 * df.iloc[:, i + 1], 'Low', 'Ok')


function(df)

输出:

  char  Age  Age1  Age2  Age3  Age4  Age5 Index
0    A   20    29    60    60    60    18    Ok
1    B   21    27    48    48    48    19    Ok
2    C   19    25    55    55    55    17    Ok
3    D   18    26    62    62    62    12    Ok

如果我将Age值之一更改为1,以使Age[i+1]列大于90%,则结果为

  char  Age  Age1  Age2  Age3  Age4  Age5 Index
0    A    1    29    60    60    60    18   Low
1    B   21    27    48    48    48    19    Ok
2    C   19    25    55    55    55    17    Ok
3    D   18    26    62    62    62    12    Ok

答案 1 :(得分:0)

我不太确定问题背后的逻辑,但是如果有很多列,您可以考虑使用类似的

import pandas as pd
df = pd.DataFrame({'char':['A', 'B', 'C', 'D'],
                   'Age':[20, 21, 19, 18],
                   'Age1':[29, 27, 25, 26],
                   'Age2':[60, 48, 55, 62], 
                   'Age3':[60, 48, 55, 62],
                   'Age4':[60, 48, 55, 62],
                   'Age5':[18, 19, 17, 12]})

cols2compare = df.columns[df.columns.str.startswith("Age")]

diz = {True:"Ok", False:"Low"}

df["Index"] = df[cols2compare].apply(lambda x: x["Age"] < x.max()*.9, 
                                     axis=1).map(diz)