【问题标题】:Create a Boolean column based on a condition根据条件创建布尔列
【发布时间】:2019-08-25 12:23:02
【问题描述】:

我有一个包含 11 列的数据框,我想根据其中两列中的值创建一个新的 0,1 列。

我已经尝试使用 np.where 创建其他列,但它不适用于这一列。

train["location"] = np.where(3750901.5068 <= train["x"] <= 3770901.5068 
and -19268905.6133 <= train['y'] <= -19208905.6133, 1, 0)

我收到此错误:ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

【问题讨论】:

    标签: python python-3.x pandas numpy


    【解决方案1】:

    您可以使用 pandas.DataFrame.isin,这将是一个更好的解决方案。也是的,你需要括号和 & 而不是 "and" 。 pandas.DataFrame.isin https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.isin.html的文档

    例如:

    df=pd.DataFrame({'a':[100,110,120,111,109],'b':[120,345,124,119,127]})
    df['c']=np.where((df['a'].isin([100,111])) & (df['b'].isin([120,128])),1,0)
    

    在你的情况下是:

    train["location"]=np.where(((train["x"].isin([3750901.5068,3770901.5069])) & (train["y"].isin([-19268905.6133,-19268905.6132])),1,0)
    

    【讨论】:

      【解决方案2】:

      我不确定您是否需要np.where。对于元素方面的and 两个系列,请在此处使用&amp; 而不是and。见:Logical operators for boolean indexing in Pandas

      另外,3750901.5068 &lt;= train["x"] &lt;= 3770901.5068 似乎在内部被 python 翻译成 (3750901.5068 &lt;= train["x"]) and (train["x"] &lt;= 3770901.5068),这又是 and 并且不起作用。因此,您需要将每个明确拆分为例如(3750901.5068 &lt;= train["x"]) &amp; (train["x"] &lt;= 3770901.5068) 或使用 Series.between 例如train["x"].between(3750901.5068, 3770901.5068, inclusive=True)。见:How to select rows in a DataFrame between two values, in Python Pandas?

      &amp; 的两个参数还需要括号。

      所以最终结果应该是这样的

      train["location"] = train["x"].between(3750901.5068, 3770901.5068, inclusive=True) &amp; train['y'].between(-19268905.6133, -19208905.6133, inclusive=True)

      这将为您提供一系列布尔值(Trues 和 Falses)。这些已经只是引擎盖下的 0 和 1。如果你真的想要 0 和 1,你可以从here 中选择一个解决方案。例如train.location = train.location.astype(int)

      【讨论】:

      • 既然您已链接到该问题,我还建议您通过my answer 解决该问题。
      • 哇,这是一个彻底的答案。阅读它让我意识到我在这里的答案是不正确的,因为foo &lt; train['y'] &lt; bar 将被翻译成foo &lt; train['y'] and train['y'] &lt; bar
      • 您可以改用Series.between
      猜你喜欢
      • 2022-01-22
      • 2021-10-23
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2018-06-10
      • 2020-10-03
      • 2020-10-02
      相关资源
      最近更新 更多