【问题标题】:ValueError: Series lengths must match to compare when matching dates in PandasValueError:在 Pandas 中匹配日期时,系列长度必须匹配才能比较
【发布时间】:2016-04-07 18:22:40
【问题描述】:

对于提出这样一个基本问题,我提前道歉,但我被难住了。

这是一个非常简单的虚拟示例。我在 Pandas 中匹配日期时遇到了一些问题,我不知道为什么。

df = pd.DataFrame([[1,'2016-01-01'], 
                   [2,'2016-01-01'],
                   [3,'2016-01-02'],
                   [4,'2016-01-03']],
                   columns=['ID', 'Date'])

df['Date'] = df['Date'].astype('datetime64')

假设我想匹配上面 df 中的第 1 行。
我事先知道我想匹配 ID 1
而且我也知道我想要的日期,事实上,我会直接从 df 的第 1 行中提取该日期以使其防弹。

some_id = 1
some_date = df.iloc[1:2]['Date']  # gives 2016-01-01

那么为什么这条线不能让我返回第 1 行呢?

df[(df['ID']==some_id) & (df['Date'] == some_date)] 

相反,我得到 ValueError: Series lengths must match to compare
我理解并且有道理......但让我想知道......如果我不能比较一对多,我还能如何比较 pandas 中的日期?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你说:

    some_date = df.iloc[1:2]['Date']  # gives 2016-01-01
    

    但这不是它所提供的。它提供了一个包含一个元素的系列,而不仅仅是一个值——当您使用 [1:2] 作为切片时,您不会得到一个元素,而是一个包含一个元素的容器:

    >>> some_date
    1   2016-01-01
    Name: Date, dtype: datetime64[ns]
    

    相反,做

    >>> some_date = df.iloc[1]['Date']
    >>> some_date
    Timestamp('2016-01-01 00:00:00')
    

    之后

    >>> df[(df['ID']==some_id) & (df['Date'] == some_date)] 
       ID       Date
    0   1 2016-01-01
    

    (请注意,如果您有很多 some_idsome_date 值要查找,则有更有效的模式,但这是一个单独的问题。)

    【讨论】:

    • 所以这一切都归结为[1:2]1之间的区别?这两种方法在语法上似乎是同义词,但显然不是。为什么不呢?
    • 即使在 pandas 上下文之外,它们也不是同义词。尝试x = [10, 20, 30],然后将print(x[1:2], type(x[1:2]))print(x[1], type(x[1])) 进行比较。一个包含一个对象的盒子和一个只有一个对象的盒子是有区别的。
    【解决方案2】:

    正如 DSM 所述,some_date 是一个系列,而不是一个值。当您使用布尔掩码并检查列的值是否等于某个变量时,我们必须确保该变量是一个值,而不是一个容器。 DSM 提到了一种可能的解决问题的方法,还有另一种解决问题的方法。

    df[(df['ID']==some_id) & (df['Date'] == some_date.values[0])]
    

    我们刚刚将 some_date 替换为 some_date.values[0]。 some_date.values 返回一个包含一个元素的数组。我们对容器中的值感兴趣,而不是容器,所以我们通过 [0] 对其进行索引以获取值。

    【讨论】:

      猜你喜欢
      • 2017-04-12
      • 1970-01-01
      • 2017-04-22
      • 2019-08-24
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      相关资源
      最近更新 更多