我有一個數據幀df
是稀疏和存儲效率我想用to_sparse()
定義D型df.to_sparse的()導致
但是它似乎新表示與dtype=float64
最終將其轉換,甚至當我的df
是dtype=int8
。
有沒有辦法指定數據類型/防止在使用to_sparse()
時自動轉換爲dtype=float64
?
我有一個數據幀df
是稀疏和存儲效率我想用to_sparse()
定義D型df.to_sparse的()導致
但是它似乎新表示與dtype=float64
最終將其轉換,甚至當我的df
是dtype=int8
。
有沒有辦法指定數據類型/防止在使用to_sparse()
時自動轉換爲dtype=float64
?
你看,dtypes不是熊貓控制的實體。 Dtypes通常是一個numpy的東西。 Dtypes不能以任何方式控制,它們是通過numpy自動聲明,並且只能在您更改數據框或numpy數組內的數據時更改。
這就是說,以float結束而不是int作爲dtype的典型原因是因爲將NaN值引入了系列或numpy數組。有人說這是一個熊貓。我個人會認爲,這是由於熊貓和裸體之間的(太)緊密耦合。
一般來說,dtypes不應該被任何東西所信任,它們是令人難以置信的不可靠的。我認爲每個與numpy/pandas合作的人如果從不暴露於dtypes就會過上更好的生活。
如果你真的很討厭浮點數,就我所知,唯一的選擇是使用字符串表示,這在大多數情況下會導致更多的問題。
從底層看,Pandas
稀疏框架實現在pandas.sparse.frame
我們看到astype()
方法仍在等待從版本0.18.0開始實施。 Ref. Github
當我們有一些實施到位後,dtype
的轉換應該像pandas.core.frame
(Pandas DataFrame
)一樣工作。給定一個熊貓DataFrame
df
我們可以將其轉換爲SparseDataFrame
,並指定dtype
df.to_sparse().astype(dtype)
ATM,SparseDataFrame
不具有dtype
很大的支持,但它目前正在開發。引用我打開的這個問題Github。
感謝您的精彩解釋。我想知道:「以float結束而不是int作爲dtype的典型原因是因爲將NaN值引入到序列或numpy數組中」,如果我使用'df.fillna(0).to_sparse( fillvalue = 0)'我避免以NaN值結尾。但這並不能解決問題。我有沒有想念你的解釋之間的界限? – Segmented
numpy不會自動將dtype float更改爲dtype int,因爲其中沒有NaN值。很明顯,在.to_sparse()轉換的某個點上有NaN值。你可以嘗試在最後添加一個'.type(int)',它會將dtypes改爲int,但這又是一個會影響性能的步驟。 – firelynx
感謝您的解釋! – Segmented