【问题标题】:i dont understand why my if cycle does not work correctly [duplicate]我不明白为什么我的 if 循环不能正常工作[重复]
【发布时间】:2019-05-16 11:21:29
【问题描述】:

我写了下一个循环,但是当我运行它时,Spyder 向我显示下一条消息:

ValueError:Series 的真值不明确。使用a.empty, a.bool()、a.item()、a.any() 或 a.all()。

为什么会这样?因为如果不满足任何条件,我指定了要分配给列的值。

if 11 >= df['age'] <= 20:
    df['age_enc'] = 20
elif 21 >= df['age'] <= 25:
    df['age_enc'] = 25
elif 26 >= df['age'] <= 30:
    df['age_enc'] = 30
elif 31 >= df['age'] <= 35:
    df['age_enc'] = 35       
elif 36 >= df['age'] <= 40:
    df['age_enc'] = 40    
elif 41 >= df['age'] <= 50:
    df['age_enc'] = 50  
elif 51 >= df['age'] <= 60:
    df['age_enc'] = 60  
else:
    df['age_enc'] = 100;

【问题讨论】:

  • df['age'] 不是单个值,而是一整列。对于需要在 if 语句中比较多个值的情况,您必须使用 anyall
  • 查看df的内容。 df['age'] 不是标量值,可能是矩阵或向量
  • 另外,你的意思是&lt;=在所有条件的第一部分,而不是&gt;=
  • 你想要pandas.cut

标签: python pandas dataframe if-statement


【解决方案1】:

因为df['age'] 在 pandas 中指定了一个 Series 类型并且它不是一个单一的值,所以您不能简单地编写 df['age'] &lt;= 20 并且它可以是任何值或全部,所以您可以简单地使用 df['age'].all() &lt;= 20

要解决您的问题,您可以使用 pandas 过滤,如下所示:

df_part = df[(df['age'] <= 20) & (df['age' >= 11)]
df_part['age_enc'] = 20

然后您可以将这些数据框部分合并在一起

【讨论】:

  • 嗯,不,不是真的,因为这仍然留下了一组可怕的if/elif,它每次都必须迭代整个数据集。使用cut。我正在打电话,所以我无法说明,但您可能可以。
【解决方案2】:

这里有两个问题。首先,您必须拆分比较。其次,这种比较会产生一个布尔型 ndarray,你不能直接使用它作为条件,因为 它是模棱两可的。你可以这样做:

if (11 <= df['age']).all() and (df['age'] <= 20).all():
    ...

这很冗长,但是这行不通

if (11 <= df['age'] <= 20).all():
    ...

请注意,我将&gt;= 更改为&lt;=,您可以使用适合您情况的anyall。如果这对你有用,请告诉我。

【讨论】:

    【解决方案3】:

    我想我找到了最简单的解决方案:

    # encoding
    from sklearn import preprocessing
    le1 = preprocessing.LabelEncoder()
    le1.fit(df['age'])
    df['age_enc'] = le1.transform(df['age'])
    #
    keys = le1.classes_
    values = le1.transform(le1.classes_)
    dictionary = dict(zip(keys, values))
    print(dictionary)
    

    因为我想转码我的变量并创建一个新列 - 这种方式可能是最简单的

    【讨论】:

      猜你喜欢
      • 2018-11-20
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多