pandas iterrows()比较只将最后结果写入所有行

2024-04-25 19:24:06 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码应该是迭代数据帧并写入“Valid”列。它只将最后一个值写入“Valid”中的所有行。你知道吗

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)

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

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循环中嵌套另一个for循环,这样我就可以引用Valid中的每一行,但这做了同样的事情。如何让它正确地写入每个值?你知道吗


Tags: 数据代码inforindextimevalprice
1条回答
网友
1楼 · 发布于 2024-04-25 19:24:06

您的错误如下:

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

此语法将price值或“Invalid”应用于整个列。你知道吗

而是使用.loc对要输入值的行/列进行特定索引:

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

同样,正如前面提到的,这个循环将是一个缓慢的解决方案,您正在尝试做什么,可能有一个更简单的矢量化方法来解决这个问题,通过合并从csvmlxrx的低值作为一个列,然后执行如下操作:

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

相关问题 更多 >