繁体   English   中英

ValueError:系列长度必须匹配才能在Pandas中匹配日期时进行比较

[英]ValueError: Series lengths must match to compare when matching dates in Pandas

我提前就提出这样一个基本问题道歉,但我很难过。

这是一个非常简单的虚拟示例。 我在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
这是我理解的,也是有道理的...但让我感到疑惑......如果我不能比较一对多,我还能比较一下熊猫的日期吗?

你说:

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值,则会有更高效的模式,但这是一个单独的问题。)

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

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

我们刚刚用some_date.values [0]替换了some_date。 some_date.values返回一个包含一个元素的数组。 我们感兴趣的是容器中的值,而不是容器,所以我们用[0]索引它来获取值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM