2014-09-21 42 views
0

我有一个奇怪的问题,我终于设法重现它。带有非唯一索引的熊猫DataFrame对象的列操作

这里是泡菜文件: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率比原始表大很多。它看起来像计算使用索引在两列上执行完整的外连接,这有些出乎意料。如何以及何时发生这种行为,有没有办法阻止它?

原始邮件

我不能用玩具问题重现,所以我会尽量解释一下的话。

我有一个熊猫DataFrame约100K行,约20列和一个非唯一索引。当我尝试计算两列之间的差异时,我得到的结果比原始表格长5倍以上。如果,而不是table.column1 - table.column2我做numpy.array(table.column1) - numpy.array(table.column2)我得到预期的结果。

它看起来像计算使用索引执行两列的完整外部联接,但是当我试图用玩具问题重现此行为时,我从来没有得到类似的结果。

我还测试了NaN S是否影响这一点:有NaN S IN在我的原始数据中的一列,但NaN玩具问题,如预期的工作,所以我必须要排除NaN秒。

如何以及何时发生此行为,并有一种更简单的方法(与转换为numpy.array相比),以防止它?

+0

只是出于好奇,你有任何'NaN'值吗?这并不能解释所有内容,但是如果你的任何一列有'NaN'值,在过去我发现合并包含'NaN'值的列以引起额外的行被添加,所以我总是检查并放下它们。无论如何值得检查。 – EdChum 2014-09-21 21:05:35

回答

1

这是< 0.15.0中的错误,请参见here。只有当您尝试在非唯一索引器上执行日期时间操作时才会显示。这是一个正确行为的例子。这将出现在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] 
+0

我终于设法重现错误(请参阅编辑的问题)。正如你可能看到的,我的Pandas版本很新。 – 2014-09-22 19:38:45

+0

好吧,这是确实不同的日期时间ops(而不是纯整数ops)....让我看看 – Jeff 2014-09-22 19:53:37

+1

错误问题在这里:https://github.com/pydata/pandas/issues/8363 – Jeff 2014-09-22 21:56:24

相关问题