使用pandas进行列操作使用非唯一索引的DataFrame对象

时间:2014-09-21 20:37:08

标签: pandas

我有一个奇怪的问题,我终于设法重现了它。

以下是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相比)以防止它出现?

1 个答案:

答案 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]