我试图将Dataframe与Series进行比较,以检查df中的一行是否等于系列,例如
import pandas as pd
import datetime as dt
d = pd.DataFrame([[1, dt.datetime(1990,12,10)],
[2, dt.datetime(1990,12,11)]])
s = d.loc[0].copy()
print(d == s) # or d.gt(s) which should do the same
这打破了以下错误
TypeError:int()参数必须是字符串,类字节对象或数字,而不是'时间戳'
比较values
会产生预期结果:
d.values == s.values
array([[ True, True],
[False, False]], dtype=bool)
此错误也不是使用字符串引发的:
d = pd.DataFrame([[1, "a"], [2, "b"]])
s = d.loc[1].copy()
print(s == d)
# 0 1
#0 True True
#1 False False
这是熊猫中的错误还是我做错了什么?
编辑:
我使用python 3.6和pandas 0.20.3
我在pandas github上打开了一个问题: 17411
答案 0 :(得分:1)
如评论中所述(并且可能值得添加到问题中)这适用于字符串,所以我不明白为什么它不适用于datetimes
关于github here的讨论表明,与数字相比,日期时间是否应该是假的是一个持续的辩论。
如果您打印d
和s
,则会收到以下信息:
d
0 1
0 1 1990-12-10
1 2 1990-12-11
S:
0 1
1 1990-12-10 00:00:00
Name: 0, dtype: object
在s中,左边的数字0,1是索引(这是s == d
比较的关键字)所以你的代码正在比较1
到1
然后2
针对1990-12-10 00:00:00
- 这就是您收到错误的原因。
为什么这适用于值 - .values
返回没有索引的numpy数组,因此比较是在你期望的形状上完成而不是考虑索引。
答案 1 :(得分:0)
我认为问题在于您要比较两个不支持比较的对象。
我会尝试这样的事情:
d[d[1] == dt.datetime(1990,12,10)]
答案 2 :(得分:0)
问题是我的版本是0.20.3,这是通过pip或conda的最新版本。
Version 0.21,这是github上的最后一个开发版本似乎解决了这个问题。
只要版本0.21在pypi上,我就会删除这个问题