我有一个奇怪的问题,我终于设法重现了它。
以下是pickle文件:https://cloudup.com/cr71lzPei-D
data = pickle.load(open('temp/toy.pkl', 'rb'))
print(data.shape)
delta = data.date1 - data.date2
print(delta.shape)
print(sys.version)
print(pd.__version__)
这是输出:
(99, 2)
(239,)
3.4.0 (default, Apr 9 2014, 11:51:10)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.38)]
'0.14.1'
正如您所看到的,delta
比原始表大得多。看起来计算使用索引在两列上执行完全外连接,这有些出乎意料。如何以及何时发生这种行为并且有办法阻止它吗?
原始消息
我无法用玩具问题重现它,所以我会尝试用文字解释它。
我有一个大约100K行的Pandas DataFrame
,大约20列和一个非唯一索引。当我尝试计算两列之间的差异时,我得到的结果比原始表长5倍以上。如果我table.column1 - table.column2
而不是numpy.array(table.column1) - numpy.array(table.column2)
我得到了预期的结果。
看起来计算使用索引在两列上执行完全外连接,但是当我尝试使用玩具问题重现此行为时,我从未得到类似的结果。
我还测试了NaN
是否影响了这一点:原始数据中的一列中有NaN
个,但NaN
的玩具问题按预期工作,所以我必须排除NaN
s。
这种行为是如何以及何时发生的,是否有更简单的方法(与转换为numpy.array
相比)以防止它出现?
答案 0 :(得分:1)
这是<中的错误。 0.15.0,见here。仅在您尝试对非唯一索引器执行datetime操作时显示。这是一个正确行为的例子。这将出现在0.15.0,计划于2014年10月的第二周。
In [1]: df = DataFrame({'A' : np.arange(5), 'B' : np.arange(1,6)},index=[2,2,3,3,4])
In [2]: df.B-df.A
Out[2]:
2 1
2 1
3 1
3 1
4 1
dtype: int64
In [3]: df = DataFrame({'A' : date_range('20130101',periods=5), 'B' : date_range('20130101 09:00:00', periods=5)},index=[2,2,3,3,4])
In [4]: df.B-df.A
Out[4]:
2 09:00:00
2 09:00:00
3 09:00:00
3 09:00:00
4 09:00:00
dtype: timedelta64[ns]