Python ValueError:在匹配中的日期时,序列长度必须匹配才能进行比较

Python ValueError:在匹配中的日期时,序列长度必须匹配才能进行比较,python,pandas,Python,Pandas,我为提出这样一个基本的问题提前道歉,但我被难住了 这是一个非常简单的虚拟示例。我在《熊猫》中遇到了一些匹配日期的问题,我不知道为什么 df = pd.DataFrame([[1,'2016-01-01'], [2,'2016-01-01'], [3,'2016-01-02'], [4,'2016-01-03']], columns=['ID',

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

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

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:序列长度必须匹配才能进行比较

这一点我理解,也有道理……但让我想知道……如果我不能将一对多进行比较,我还能如何比较熊猫的日期呢?

你说:

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

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

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

我们刚刚用some_date.values[0]替换了some_date。某些_date.values返回一个包含一个元素的数组。我们感兴趣的是容器中的值,而不是容器中的值,因此我们通过[0]对其进行索引以获得值。

因此,这一切都归结为
[1:2]
1
之间的差异?这两种方法在语法上似乎是同义的,但显然不是。为什么不呢?即使在熊猫的上下文之外,它们也不是同义词。尝试
x=[10,20,30]
然后将
print(x[1:2],type(x[1:2])
print(x[1],type(x[1]))进行比较。
。一个盒子里只有一个物体和一个物体是有区别的。