2016-04-26 4 views
1

私はまばらであるとメモリ効率のために、私は場合でも、新しい表現がdtype=float64で終わると思われるしかしto_sparse()df.to_sparseのDTYPE()結果の定義

を使用して、それを変換したいデータフレームdfを持っています私のdfdtype=int8です。

to_sparse()を使用すると、データタイプを指定する方法はありますか/自動変換が無効になるのはdtype=float64ですか?

答えて

1

要するに、いいえ。

dtypesはpandasによって制御されるエンティティではありません。 Dタイプは、通常、数値が小さいものです。 Dタイプは決して制御できません。が自動的にアサートされます。はnumpyによって変更され、データフレームまたはnumpy配列内のデータを変更する場合にのみ変更できます。

つまり、dtypeとしてintではなくfloatで終わる典型的な理由は、系列またはnumpy配列にNaN値が導入されているためです。これはパンダだと言う人もいます。私は個人的には、パンダとナンピーの間の(あまりにも)密接なカップリングによるものだと主張するだろう。

通常、dtypesは何にも信頼されるべきではありません。信用できない信頼性があります。私はnumpy/pandasで働いている人は誰もdtypesに全く晒されなかったらより良い生活を送るだろうと思う。

あなたが実際に浮動小数点を嫌うならば、私が知る限り他の唯一の選択肢は、文字列表現を使用することです。もちろん、ほとんどの場合、さらに多くの問題が発生します。

+0

素晴らしい説明をいただきありがとうございます。私は疑問を抱いていました: "dtypeとしてintの代わりにfloatで終わる典型的な理由は、' df.fillna(0).to_sparse()を使うとNaNの値がシリーズまたはnumpyの配列に導入されるからです。 fillvalue = 0) 'NaN値で終わることは避けてください。しかしこれは問題を解決しません。私はあなたの説明からその行を読むのを忘れましたか? – Segmented

+0

numpyは自動的にdtype floatをdtype intに変更しません。これはNait値がないためです。明らかに.to_sparse()変換のある時点でNaN値があります。最後に '.astype(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、SparseDataFramedtypeのための多くのサポートを持っていないが、それは、現在開発されています。この問題は、私がGithubを開いたことを参照してください。

関連する問題