【问题标题】:How would I iterate over a Pandas Series and compare it to single float?我将如何迭代 Pandas 系列并将其与单个浮点数进行比较?
【发布时间】:2019-12-20 05:17:03
【问题描述】:

我想知道是否可以检查两个表之间的计算结果是否可以与比较运算符一起使用。

假设我有两个数据框。

DF

| user_id | col1| col2| col3| col4| check |
|---------|-----|-----|-----|-----|-------|
| 100     |  1  |  2  |  1  |  0  |   5   |
| 200     |  2  |  4  |  0  |  2  |   5   |

DF2

| user_id | col1| col2| col3| col4| check |
| 300     |  3  |  6  |  2  |  0  |   5   |
| 400     |  4  |  8  |  0  |  4  |   5   |

对于 df 中的每个用户,我会遍历 df2 中的每个用户。然后我想添加它们的 col1 值,看看它们是否大于数字 5。如果是,则应返回“大于 5”。如果不是,则应返回“小于 5”。

这就是我想象的语法,但它不起作用。

for a in df.user_id:
    for b in df2.user_id:
        if df.col1 + df.col2 > df.check:
            print('Greater than 5')
        else:
            print('Less than 5')

我得到一个 ValueError:

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

这背后的逻辑是什么,将迭代项与单值进行比较如何工作?

此外,除了静态值与可迭代系列之外,在 for 循环中使用 df.check 列值与 int(5) 是否有区别?这有什么效果?

谢谢!

【问题讨论】:

    标签: python python-3.x pandas for-loop


    【解决方案1】:
    for a in df:
        for b in df2:
            if df.loc[a,"col1"] + df2.loc[b,"col1"] > df.loc[a,"check"]:
                print('Greater than 5')
            else:
                print('Less than 5')
    

    之前,您要添加一整列并将其与另一整列进行比较。相反,使用.loc 查看一列的行索引。

    【讨论】:

      【解决方案2】:

      您也许应该改用一种更具关联性的方法。我将继续的方式是:

      df_result = (pd.concat([df, df2], axis=0)
                   .assign(greater_than_check = lambda d: (d.col1 + d.col2)>d.check))
      

      col1 + col2 大于 check 的用户:

      df_result.loc[lambda d: d.greater_than_check, "user_id"]
      

      【讨论】:

      • 这行得通!作为一个后续问题,如果我有超过 5 亿行,这是否与将返回 false 的用户踢出的迭代过程一样有效?我面临的一个问题是导致内存问题的较大数据集 - 缩小/缩小数据集并不是一种真正的选择。有什么想法吗?
      • 是的,当然。您应该通过将最后一个表达式分配给 df_result:df_result = df_result.loc[lambda d: d.greater_than_check, "user_id"] 来删除不需要保留在数据中的用户。如果它对您有用,请不要忘记将我的答案标记为“已接受”:D
      • 谢谢!我会试一试!不过可能有更多问题哈哈。非常感谢!
      猜你喜欢
      • 2019-01-08
      • 2021-05-28
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 2017-08-01
      相关资源
      最近更新 更多