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

Mon*_*eck 11 python 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')
Run Code Online (Sandbox Code Playgroud)

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

some_id = 1
some_date = df.iloc[1:2]['Date']  # gives 2016-01-01
Run Code Online (Sandbox Code Playgroud)

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

df[(df['ID']==some_id) & (df['Date'] == some_date)] 
Run Code Online (Sandbox Code Playgroud)

相反,我得到 ValueError: Series lengths must match to compare
了我理解的,并且有道理...但让我感到疑惑...如果我不能比较一对多的话,我怎么能比较熊猫的日期呢?

DSM*_*DSM 11

你说:

some_date = df.iloc[1:2]['Date']  # gives 2016-01-01
Run Code Online (Sandbox Code Playgroud)

但这不是它给出的.它为Series提供了一个元素,而不仅仅是一个值 - 当你[1:2]用作切片时,你不会得到一个元素,而是一个带有一个元素的容器:

>>> some_date
1   2016-01-01
Name: Date, dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)

相反,做

>>> some_date = df.iloc[1]['Date']
>>> some_date
Timestamp('2016-01-01 00:00:00')
Run Code Online (Sandbox Code Playgroud)

之后

>>> df[(df['ID']==some_id) & (df['Date'] == some_date)] 
   ID       Date
0   1 2016-01-01
Run Code Online (Sandbox Code Playgroud)

(请注意,有更高效的模式,如果你有很多的some_idsome_date值来查找,但这是另外一个问题.)

  • 即使在熊猫语境之外,它们也不是同义词。尝试 `x = [10, 20, 30]` 然后比较 `print(x[1:2], type(x[1:2]))` 和 `print(x[1], type(x[1]) ]))`。一个装有一个物体的盒子和一个只有一个物体的盒子是有区别的。 (2认同)