在迭代数据帧时,“序列的真值是模糊的”错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在迭代数据帧时,“序列的真值是模糊的”错误相关的知识,希望对你有一定的参考价值。

我试图在名为active_positions的数据框中“Todays Price”列高于“Target Price”列的条件下添加列表“quantity”。

我尝试了以下代码:

for index, row in active_positions.iterrows():
    if row['Todays Price'] >= row['Target Price']:
        quantities.append(row['Quantity'])

当我尝试这个时,我收到以下错误:

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

我找到了其他有这个问题的人,我看到的建议是使用“&”代替“和”,这不适用于这种情况(我不认为)。

我也看到了使用np.where(condition,effect-A,effect-B)的建议。这对我不起作用,因为如果不满足条件,我不想在列表“数量”中添加任何内容,当我尝试这样做时:

for index, row in active_positions.iterrows():
above_target = row['Todays Price'] >= row['Target Price']
quantities.append(np.where(above_target, row['Quantity'],))

Traceback (most recent call last):

  File "<ipython-input-656-9c9f6030d250>", line 3, in <module>
    quantities.append(np.where(above_target, row['Quantity'],))

ValueError: either both or neither of x and y should be given

我知道我可以通过在np.where子句中的“row ['Quantity]”表达式后面加零来解决这个问题,但是就像我说的那样,我不想在数量列表中添加零。

请指教,谢谢!

答案

为了速度,您不应该尝试迭代数据帧。如果您只想要条件为True的Quantity值,则可以应用如下掩码:

import pandas as pd
import numpy as np

a = {'Todays Price': [1, 2, 1, 5, 6], 'Target Price': [1, 3, 2, 4, 3], 
     'Quantity': [10, 11, 12, 13, 15]}

df = pd.DataFrame(a)

quantities = df[df['Todays Price'] >= df['Target Price']]['Quantity']
quantities_list = quantities.values.tolist() # For pure Python list result

# Or perhaps more clearly for the same result:

mask = df['Todays Price'] >= df['Target Price']

quantities = df[mask]['Quantity']
quantities_list = quantities.values.tolist()

以上是关于在迭代数据帧时,“序列的真值是模糊的”错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark 中创建数据帧时出错

虽然尝试使用用于olp的spark-connector发布到索引层,但在创建数据帧时获得错误不是术语。如何解决此错误?

有没有办法循环多个数据帧以删除相同的列?

如何在熊猫中迭代数据框时保留数据类型?

广播哈希连接 - 迭代

在 pandas 中加入数据帧时的内存问题(时间索引)