2016-04-26 30 views
1

我有一個數據幀df是稀疏和存儲效率我想用to_sparse()定義D型df.to_sparse的()導致

但是它似乎新表示與dtype=float64最終將其轉換,甚至當我的dfdtype=int8

有沒有辦法指定數據類型/防止在使用to_sparse()時自動轉換爲dtype=float64

回答

1

總之。編號

你看,dtypes不是熊貓控制的實體。 Dtypes通常是一個numpy的東西。 Dtypes不能以任何方式控制,它們是通過numpy自動聲明,並且只能在您更改數據框或numpy數組內的數據時更改。

這就是說,以float結束而不是int作爲dtype的典型原因是因爲將NaN值引入了系列或numpy數組。有人說這是一個熊貓。我個人會認爲,這是由於熊貓和裸體之間的(太)緊密耦合。

一般來說,dtypes不應該被任何東西所信任,它們是令人難以置信的不可靠的。我認爲每個與numpy/pandas合作的人如果從不暴露於dtypes就會過上更好的生活。

如果你真的很討厭浮點數,就我所知,唯一的選擇是使用字符串表示,這在大多數情況下會導致更多的問題。

+0

感謝您的精彩解釋。我想知道:「以float結束而不是int作爲dtype的典型原因是因爲將NaN值引入到序列或numpy數組中」,如果我使用'df.fillna(0).to_sparse( fillvalue = 0)'我避免以NaN值結尾。但這並不能解決問題。我有沒有想念你的解釋之間的界限? – Segmented

+0

numpy不會自動將dtype float更改爲dtype int,因爲其中沒有NaN值。很明顯,在.to_sparse()轉換的某個點上有NaN值。你可以嘗試在最後添加一個'.type(int)',它會將dtypes改爲int,但這又是一個會影響性能的步驟。 – firelynx

+0

感謝您的解釋! – Segmented

1

從底層看,Pandas稀疏框架實現在pandas.sparse.frame我們看到astype()方法仍在等待從版本0.18.0開始實施。 Ref. Github

當我們有一些實施到位後,dtype的轉換應該像pandas.core.frame(Pandas DataFrame)一樣工作。給定一個熊貓DataFramedf我們可以將其轉換爲SparseDataFrame,並指定dtype

df.to_sparse().astype(dtype) 

ATM,SparseDataFrame不具有dtype很大的支持,但它目前正在開發。引用我打開的這個問題Github