【问题标题】:pandas iterrows() comparison only writing last result to all rowspandas iterrows() 比较只将最后一个结果写入所有行
【发布时间】:2020-02-11 07:52:13
【问题描述】:

假定以下代码会遍历数据框并写入“有效”列。它只是将最后一个值写入“有效”中的所有行。

for index, row in lxrx.iterrows():
time_cur = (row['time'])
low_val = csvm.loc['LXRX', time_cur].low
price = (row['Price'])
if price > low_val:
    lxrx['Valid'] = price
else:
    lxrx['Valid'] = 'Invalid'

为了测试我使用了:print(price) & print(low_val)

它输出我所期望的 - 每个价格然后每个 low_val:

3.13  2.8    2.1  3.06    3.36  3.06

它输出左下方,而不是我想要的右下方。

Index Valid     rather than     Index Valid
0     3.36                      0     3.13
1     3.36                      1     2.10
2     3.36                      2     3.36  

我什至尝试在该循环中嵌套另一个 for 循环,以便我可以引用 Valid 中的每一行,但这也是同样的事情。如何让它正确写入每个值?

【问题讨论】:

  • 我建议弄清楚如何使用merge 以及矢量化操作来实现您想要的结果。您不仅不太可能遇到这类问题,而且您的代码几乎肯定会运行得更快。
  • @PMende 是否可以比较不同长度的索引,但将所有行保持在较长的系列中,而不是较短的系列中删除重复项?
  • 您能否包含一些来自 lxrx 和 csvm 的示例数据?一旦我们有了它,我就可以编写一个简单、惯用且有效的解决方案。

标签: python pandas loops numpy if-statement


【解决方案1】:

您的错误在于以下几行:

if price > low_val:
    lxrx['Valid'] = price
else:
    lxrx['Valid'] = 'Invalid'

此语法将price 值或“无效”应用于整个列。

改为使用.loc 专门索引您要输入值的行/列:

if price > low_val:
    lxrx.loc[index, 'Valid'] = price
else:
    lxrx.loc[index, 'Valid'] = 'Invalid'

正如已经提到的,这个循环将是一个缓慢的解决方案来解决你正在尝试做的事情,可能有一种更简单的矢量化方法来解决这个问题,将csvm 中的低值合并到lxrx 作为列,然后执行以下操作:

lxrx["Valid"] = np.where(lxrx["Price"] > lxrx["low_value_from_csvm"], lxrx["Price"], "Invalid")

【讨论】:

    猜你喜欢
    • 2019-06-06
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2014-12-10
    • 2022-01-26
    • 2015-09-22
    • 1970-01-01
    相关资源
    最近更新 更多