dtypes
Pandasの列をチェックしたところDataFrame
、整数列のデータ型はnp.int64
であることがわかりましたが、驚くべきことに、Unixではこれは同等ですint
が、Windowsではそうではありません。なぜ彼らは同じように振る舞わないのですか?を使用して比較したときに結果が同じになるようにDataFrameを作成する方法はありdf.dtypes == int
ますか?
これは、説明するためのサンプルコードです。
In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: pd.__version__
Out[3]: '1.0.1'
In [4]: np.__version__
Out[4]: '1.18.1'
In [5]: data = pd.DataFrame({'col_1': range(5), 'col_2': np.linspace(0, 1, 5)})
In [6]: data.dtypes
Out[6]:
col_1 int64
col_2 float64
dtype: object
In [7]: data.dtypes == float
Out[7]:
col_1 False
col_2 True
dtype: bool
これらはすべて、WindowsとUnixで同じ結果を生成しますが、dtypesをint
Windowsと比較すると、次のようになります。
In [8]: data.dtypes == int
Out[8]:
col_1 False
col_2 False
dtype: bool
そしてUnixでは私は
In [8]: data.dtypes == int
Out[8]:
col_1 True
col_2 False
dtype: bool
データ型を指定してみました。これはUnixで動作し、追加することでデータ型を入力できますdtype=(int, float)
In [9]: data = pd.DataFrame({'col_1': range(5), 'col_2': np.linspace(0, 1, 5)}, dtype=(int, float))
In [10]: data.dtypes
Out[10]:
col_1 int64
col_2 float64
dtype: object
しかし、Windowsでは、このコードは次のように失敗します。 ValueError
In [10]: data = pd.DataFrame({'col_1': range(5), 'col_2': np.linspace(0, 1, 5)}, dtype=(int, float))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-25-284f0f12d3b6> in <module>
----> 1 data = pd.DataFrame({'col_1': range(5), 'col_2': np.linspace(0, 1, 5)}, dtype=(int, float))
~\Miniconda3\envs\pandas_test\lib\site-packages\pandas\core\frame.py in __init__(self, data, index, columns, dtype, copy)
423 data = {}
424 if dtype is not None:
--> 425 dtype = self._validate_dtype(dtype)
426
427 if isinstance(data, DataFrame):
~\Miniconda3\envs\pandas_test\lib\site-packages\pandas\core\generic.py in _validate_dtype(self, dtype)
257
258 if dtype is not None:
--> 259 dtype = pandas_dtype(dtype)
260
261 # a compound dtype
~\Miniconda3\envs\pandas_test\lib\site-packages\pandas\core\dtypes\common.py in pandas_dtype(dtype)
1872 # raise a consistent TypeError if failed
1873 try:
-> 1874 npdtype = np.dtype(dtype)
1875 except SyntaxError:
1876 # np.dtype uses `eval` which can raise SyntaxError
ValueError: mismatch in size of old and new data-descriptor
あらゆるタイプの整数または浮動小数点数を比較するプラットフォームにとらわれない手段の場合、次を使用できます。
In [10]: [np.issubdtype(dtype, np.integer) for dtype in data.dtypes]
Out[10]: [True, False]
In [11]: [np.issubdtype(dtype, np.float) for dtype in data.dtypes]
Out[11]: [False, True]
Windows / Unixの違いの背後にある主な問題は、UnixとWindowsのint
パンダdtype
に相当することです。np.int64
np.int32
このコードは、動作の違いを示しています。
import numpy as np
import pandas as pd
print(f'numpy version: {np.__version__}')
print(f'pandas version: {pd.__version__}')
data = pd.DataFrame({
'col_i': range(5),
'col_f': np.linspace(0, 1, 5),
})
data['col_i32'] = data.col_i.astype(np.int32)
data['col_i64'] = data.col_i.astype(np.int64)
data['col_f32'] = data.col_i.astype(np.float32)
data['col_f64'] = data.col_i.astype(np.float64)
print(f'\ndata.dtypes: \n{data.dtypes}')
print(f'\ndata.dtypes == int: \n{data.dtypes == int}')
print(f'\ndata.dtypes == float: \n{data.dtypes == float}')
Windowsでの結果は次のとおりです。
numpy version: 1.18.1
pandas version: 1.0.1
data.dtypes:
col_i int64
col_f float64
col_i32 int32
col_i64 int64
col_f32 float32
col_f64 float64
dtype: object
data.dtypes == int:
col_i False
col_f False
col_i32 True # the np.int32 column
col_i64 False
col_f32 False
col_f64 False
dtype: bool
data.dtypes == float:
col_i False
col_f True
col_i32 False
col_i64 False
col_f32 False
col_f64 True
dtype: bool
Unixでの出力は次のとおりです。
numpy version: 1.18.1
pandas version: 1.0.1
data.dtypes:
col_i int64
col_f float64
col_i32 int32
col_i64 int64
col_f32 float32
col_f64 float64
dtype: object
data.dtypes == int:
col_i True # a np.int64 column
col_f False
col_i32 False
col_i64 True # a np.int64 column
col_f32 False
col_f64 False
dtype: bool
data.dtypes == float:
col_i False
col_f True
col_i32 False
col_i64 False
col_f32 False
col_f64 True
dtype: bool
dtype
Windowsで失敗を指定する理由は、タイプのメモリサイズが同じである必要があるためです。パンダドキュメントという状態「のみの単一DTYPEが許可されています。」ただし、次のいずれかがWindowsとUnixで機能するため、これは明らかに当てはまりません。
data = pd.DataFrame({'col_i32': range(5), 'col_f32': np.linspace(0, 1, 5)}, dtype=(np.int32, np.float32))
data = pd.DataFrame({'col_i32': range(5), 'col_f32': np.linspace(0, 1, 5)}, dtype=(np.int64, np.float64))
彼らが実際に意味したのは、「単一の[データサイズ]のみが許可される」ということだと思います。
指定時のエラーのdtype=(int, float)
問題は、上記の主要な問題に戻ります。Windowsはint
asnp.int32
およびfloat
asをキャストしますがnp.float64
、Unixは代わりにint
asnp.int64
およびfloat
asをキャストしnp.float64
ます。Pandasでは、同じメモリサイズが必要です。これは、Unixでは機能しますが、Windowsでは機能しません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加