【问题标题】:Looping if statement on pandas df在熊猫df上循环if语句
【发布时间】:2020-08-29 20:50:02
【问题描述】:

我有一个由三列(A、B、C)组成的 df,每列都包含简单的数字。 我想检查 A 和 B 中的某些元素是否加起来为 C 中的一个元素(A+B = C)并返回满足他条件的 A、B 元素。我正在使用以下代码:

EW_sum = []
for i in df['A']:
    for j in df['B']:        
        if (i+j) in df['C']:
            x = (i, j)
            EW_sum.append((x))

但是,代码并没有遍历 A 和 B 中的所有元素;它只给了我 A+B = C 然后中止的第一种情况。可能是什么问题呢? 谢谢

【问题讨论】:

  • 请编辑您的问题以包含minimal reproducible example
  • 根据您的问题陈述,我认为您可以简单地做df.loc[df['A'] + df['B'] == df['C']][['A', 'B']]
  • @0x5453 实际上OP在代码中的逻辑是不同的。
  • @QuangHoang 是的,但他也说代码不正确,所以我完全脱离了描述。

标签: python pandas loops if-statement


【解决方案1】:

这里的关键问题是 x in y 其中 y 是熊猫 DataFrameSeries 检查 x 是否在 yindex 中,而不是值。

您可以通过查看df.__contains__ 的文档字符串看到这一点,这是您调用x in df['C'] 时调用的方法。:

>>> help(df.__contains__)
Help on method __contains__ in module pandas.core.generic:

__contains__(key) method of pandas.core.frame.DataFrame instance
    True if the key is in the info axis

您可以通过更改为 if (i + j) in df['C'].values 行来修复您的代码,该行访问保存 C 列中数据的 numpy 数组并调用 its __contains__ 方法。

对于小型 DataFrame,这无关紧要,但对于大型数据集,检查 x in df['C'].values(或使用 pandas contains 方法和 df['C'].contains(x).any())将比将数据强制到列表快得多。

【讨论】:

    【解决方案2】:

    我改用这段代码解决了这个问题。谢谢

    for i in range(0, len(df)):
        x = df['A'].iloc[i]
        y= df['B'].iloc[i]
        if x+y  in list(df['C']):
            EW_sum.append((x, y))
    

    【讨论】:

    • 仅供参考,您应该 avoid 循环遍历 DataFrames。请参阅 Michael 的帖子以获得更快的矢量化解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2015-05-19
    • 1970-01-01
    相关资源
    最近更新 更多