带有空数据帧的Pandas isin会在datetime类型上生成epoch值,而不是boolean

时间:2017-02-22 10:53:25

标签: python pandas

我注意到在DataFrame上执行isin,其中包含操作数为空DataFrame的日期时间类型,它会生成epoch datetime值(即1970-01-01),而不是'False'。这似乎不太可能是正确的吗?

以下代码演示了这一点:

(pandas = 0.19.2,numpy = 1.12.0)

import pandas as pd

data = {'date': ['2014-05-01 18:47:05.069722', '2014-05-01 18:47:05.119994', '2014-05-02 18:47:05.178768']}
data2 = {'date': ['2014-05-01 18:47:05.069722', '2014-05-01 18:47:05.119994']}
df = pd.DataFrame(data, columns = ['date'])
df['date'] = pd.to_datetime(df['date'])
df2 = pd.DataFrame(data2, columns = ['date'])
df2['date'] = pd.to_datetime(df2['date'])
df3 = pd.DataFrame([], columns = ['date'])
df4 = pd.DataFrame()

print df.isin(df2)
print df.isin(df3)
print df.isin(df4)

输出:

    date
0   True
1   True
2  False
    date
0 1970-01-01
1 1970-01-01
2 1970-01-01
    date
0 1970-01-01
1 1970-01-01
2 1970-01-01

我通常会期待一个False值列表而不是'1970-01-01'?我注意到,当pandas = 0.16.2和numpy = 1.9.2时,df.isin(df3)会产生更多预期:

   date
0  False
1  False
2  False

df.isin(df4)与之前一样。

1 个答案:

答案 0 :(得分:0)

这对我来说绝对是一个错误。 isin() DataFrame.eq调用了in the source code Pandas isin with empty dataframe produces epoch value on datetime type instead of boolean #15473,奇怪的行为可以与DataFrame.eq本身重现。

>>> df
                        date
0 2014-05-01 18:47:05.069722
1 2014-05-01 18:47:05.119994
2 2014-05-02 18:47:05.178768

>>> df.eq(pd.DataFrame(dict(date=[np.nan]*3)))
        date
0 1970-01-01
1 1970-01-01
2 1970-01-01

我看到你现在把它提升为一个悬而未决的问题,

应该为即将发布的版本解决。