【问题标题】:Python if statement retrieving "The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."Python if 语句检索“系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。”
【发布时间】:2019-12-06 20:16:18
【问题描述】:

我有 2 个数据集,一个列表 r 和一个数据框 df

r = [1,1,1,1,1,1,1,1,2,2]

df

|----|----|----|----|----|----|----|----|----|----|
| d1 | d2 | d3 | d4 | d5 | d6 | d7 | d8 | d9 | d10|
|----|----|----|----|----|----|----|----|----|----|
|  0 |  0 |  1 |  0 |  0 |  1 |  1 |  0 |  1 |  1 |
|  1 |  0 |  1 |  1 |  0 |  0 |  1 |  1 |  1 |  1 |
|  1 |  1 |  0 |  1 |  1 |  0 |  1 |  0 |  0 |  0 |
|  0 |  0 |  0 |  1 |  0 |  1 |  1 |  1 |  1 |  1 |

我正在尝试运行 if 语句,该语句评估从 dfr 中选择的随机值。 但是我得到一个错误。

this link 中的帖子暴露了问题,我确实尝试了这些方法,但似乎没有用。

我尝试使用上面链接和错误中提出的方法(.any() , .all(), .bool()) 但看不到让它工作。

df1 = df.sample(n=1)
if(df1 <= r):
    df
    r-=df

例如,如果检索 df 的第一行,我希望将 r 分配如下 (r):

r = [1,1,0,1,1,0,0,1,1,1]

【问题讨论】:

  • 欢迎来到 SO。请查看How to Ask 并创建一个包含所需输出minimal reproducible example
  • 检查df1的类型(打印出来)
  • any()all()等是内置函数。不要使用点运算符来调用它们 - 像 if any(df1): 或其他东西一样
  • 是的,干杯@GreenCloakGuy。

标签: python dataframe if-statement boolean


【解决方案1】:

if 将引发错误,因为您要在两组数据之间进行比较,每组数据具有多个值,这是不明确的。这就是为什么 numpy 要求您应用 any()all() 将其传递给 if

至于你的问题。您应该将r 定义为一个数组:

r = np.asarray(r)

然后,如果您只想修改r(逐个值并基于您的比较),请使用掩码:

df1 =  df.sample(1).values.ravel()   #to transform the row into a flat array
r -= (df1 * (df1<=r))

【讨论】:

    【解决方案2】:

    Python 正在处理您的 if 语句,因为它将列表与 pandas 数据框对象进行比较。您可以轻松地将数据框转换为列表并进行比较。在下面的代码中,我将值转换为列表并选择了第一个元素,这是因为 tolist() 方法将返回列表列表 [[selected row]]。

    import numpy as np
    import pandas as pd
    df = pd.DataFrame(np.random.randint(0,1,size=(100,10)))
    print(df.head(10))
    
    r = [1,1,0,1,1,0,0,1,1,1]
    rand_row = df.sample(n=1).values.tolist()[0]
    
    if rand_row <= r:
        r = np.array(r) - np.array(rand_row)
    

    【讨论】:

      【解决方案3】:

      不清楚你想要达到什么目的......上面的答案有点复杂,我会选择更简单的东西,比如使用事实

      (a - b if a >= b else a) == a - b * (a >= b)
      

      然后您可以轻松地矢量化您的操作:

      # create some data
      df = pd.DataFrame(np.random.random_integers(0,2,(5,10)))
      r = [1,1,1,1,1,1,1,1,2,2]
      print(df.shape, len(r))
      # for on row :
      df1 = df.sample(1).values[0]
      print(df1)
      rslt =  df1 - r * (df1 >= r)
      print(rslt)
      # and straitforwadly for n rows:
      rslt_manyrows = df - r * (df >= r)
      print(rslt_manyrows)
      

      如果您正在考虑,这个解决方案比原生 pandas / 迭代 python 快得多。

      希望有帮助!

      【讨论】:

        猜你喜欢
        • 2020-02-12
        • 2019-01-24
        • 2021-08-31
        • 2016-12-01
        • 1970-01-01
        • 2019-12-11
        • 1970-01-01
        • 2021-08-06
        • 2020-05-27
        相关资源
        最近更新 更多