【问题标题】:Python-pandas: the truth value of a series is ambiguousPython-pandas:一个序列的真值是模棱两可的
【发布时间】:2019-05-18 16:43:41
【问题描述】:

我目前正在尝试将 json 文件(我已经可以处理)中的值与 csv 文件中的值(这可能是问题)进行比较。我当前的代码如下所示:

for data in trades['timestamp']:
    data = pd.to_datetime(data)
    print(data)
       if data == ask_minute['lastUpdated']:
           #....'do something'

这给出了:

":Series的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。"

我现在的print(data) 是这样的:

2018-10-03 18:03:38.067000
2018-10-03 18:03:38.109000
2018-10-03 18:04:28
2018-10-03 18:04:28.685000

但是,我仍然无法将 CSV 文件中的这些时间戳与我的 Json 文件中的时间戳进行比较。有人有想法吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    让我们把它简化为一个更简单的例子。例如,通过以下比较:

    3 == pd.Series([3,2,4,1])
    
    0     True
    1    False
    2    False
    3    False
    dtype: bool
    

    您得到的结果是布尔值的Series,大小与表达式右侧的pd.Series 相等。所以这里真正发生的是整数在整个系列中广播,然后将它们进行比较。所以当你这样做时:

    if 3 == pd.Series([3,2,4,1]):
        pass
    

    ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

    你得到一个错误。这里的问题是您将pd.Series 与一个值进行比较,因此您将拥有多个True 和多个False 值,如上例所示。这当然是模棱两可的,因为条件既不是True 也不是False

    因此,您需要进一步聚合结果,以便操作产生单个 boolean 值。为此,您必须使用 anyall,具体取决于您是否需要至少一个 (any) 或 all 值来满足条件。

    (3 == pd.Series([3,2,4,1])).all()
    # False
    

    (3 == pd.Series([3,2,4,1])).any()
    # True
    

    【讨论】:

      【解决方案2】:

      我看到的问题是,即使您正在评估数据框中的一行,代码也知道数据框有能力拥有很多行。该代码不只是假设您想要唯一存在的行。你必须明确地告诉它。我解决的方法是这样的:

      if data.iloc[0] == ask_minute['lastUpdated']:
      

      那么代码就知道您正在选择存在的一行。

      【讨论】:

      • 您的答案应该以代码形式给出。您可以使用编辑器或反引号来突出显示代码。
      猜你喜欢
      • 1970-01-01
      • 2022-09-28
      • 2015-09-14
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多