2014-09-21 54 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

相關問題