Pandas整数の `dtypes`がUnixとWindowsで同じように動作しないのはなぜですか?

スティーブンC.ハウエル

dtypesPandasの列をチェックしたところ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をintWindowsと比較すると、次のようになります。

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
スティーブンC.ハウエル

あらゆるタイプの整数または浮動小数点数を比較するプラットフォームにとらわれない手段の場合、次を使用できます。

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.int64np.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

dtypeWindowsで失敗を指定する理由は、タイプのメモリサイズが同じである必要があるためです。パンダドキュメントという状態「のみの単一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はintasnp.int32およびfloatasをキャストますがnp.float64、Unixは代わりにintasnp.int64およびfloatasをキャストnp.float64ます。Pandasでは、同じメモリサイズが必要です。これは、Unixでは機能しますが、Windowsでは機能しません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

同じ構造が与えられているのに、インポートと同じように動作する必要がないのはなぜですか

分類Dev

ES6 Promise-catch()からのthrowとthen()からのthrowが同じように動作しないのはなぜですか?

分類Dev

これらのapt-packagesがUbuntuとHerokuで同じように動作しないのはなぜですか?

分類Dev

typescriptの未定義の型がオプションと同じように動作しないのはなぜですか?

分類Dev

forループの並行キューの.asyncがDispatchQueue.concurrentPerformと同じように動作しないのはなぜですか?

分類Dev

式のLHSの `rlang :: sym`と` rlang :: quo_name`が同じように動作するのはなぜですか?

分類Dev

Forループロジックの反復同じように動作しないのはなぜですか?

分類Dev

スライス[]構造体が[]ビルトインと同じように動作しないのはなぜですか?

分類Dev

JQueryのtrigger( "remove")がトリガーなしのremove()と同じように動作するのはなぜですか?

分類Dev

mutisetがsetのように動作しないのはなぜですか

分類Dev

Nullable <T>でのLinq結合が==と同じように機能しないのはなぜですか?

分類Dev

Python3のPrettyPrinterの動作がPython2の動作と異なるのはなぜですか。また、同じ動作を得るにはどうすればよいですか。

分類Dev

max-width:0の場合と同じように動作するのはなぜですか?

分類Dev

%演算子がPythonとJavaで同じように機能しないのはなぜですか?

分類Dev

ggplotlyがrgplotと同じようにrmarkdownで機能しないのはなぜですか

分類Dev

Scala:なぜfoo(1,2)とfoo((1,2))が同じように動作するのですか?

分類Dev

JavaScriptの論理積(&&)がif条件付きと同じように機能しないのはなぜですか?

分類Dev

2つの異なる単純なリスト変数が互いにまったく同じように動作するのはなぜですか?

分類Dev

「cp-ra /。b」が同じように動作するのはなぜですか。

分類Dev

「return」が「console.log()」と同じように機能しないのはなぜですか

分類Dev

IIf が If/Then/EndIf と同じように機能しないのはなぜですか?

分類Dev

同じプログラムがWindowsとMacで異なる動作をするのはなぜですか

分類Dev

戻るボタンとカスタムスクローラー、なぜ2つのWebページで同じように動作しないのですか?

分類Dev

いつint?とNullable <int>は同じですが、なぜ異なる動作をするのですか?

分類Dev

f#で実装された型がC#アプリケーションから呼び出されたときにC#型と同じように動作しないのはなぜですか?

分類Dev

CSSグリッドで、小さい画面サイズで1FR + 9FRが10FRと同じように動作しないのはなぜですか?

分類Dev

`sum + = x`が整数型の` sum + = * x`と同じように機能するのはなぜですか?これは自動逆参照ですか?

分類Dev

a =(b ++)がa = b ++と同じ動作をするのはなぜですか?

分類Dev

findと同じシェルスクリプトで動作しないのはなぜですか?

Related 関連記事

  1. 1

    同じ構造が与えられているのに、インポートと同じように動作する必要がないのはなぜですか

  2. 2

    ES6 Promise-catch()からのthrowとthen()からのthrowが同じように動作しないのはなぜですか?

  3. 3

    これらのapt-packagesがUbuntuとHerokuで同じように動作しないのはなぜですか?

  4. 4

    typescriptの未定義の型がオプションと同じように動作しないのはなぜですか?

  5. 5

    forループの並行キューの.asyncがDispatchQueue.concurrentPerformと同じように動作しないのはなぜですか?

  6. 6

    式のLHSの `rlang :: sym`と` rlang :: quo_name`が同じように動作するのはなぜですか?

  7. 7

    Forループロジックの反復同じように動作しないのはなぜですか?

  8. 8

    スライス[]構造体が[]ビルトインと同じように動作しないのはなぜですか?

  9. 9

    JQueryのtrigger( "remove")がトリガーなしのremove()と同じように動作するのはなぜですか?

  10. 10

    mutisetがsetのように動作しないのはなぜですか

  11. 11

    Nullable <T>でのLinq結合が==と同じように機能しないのはなぜですか?

  12. 12

    Python3のPrettyPrinterの動作がPython2の動作と異なるのはなぜですか。また、同じ動作を得るにはどうすればよいですか。

  13. 13

    max-width:0の場合と同じように動作するのはなぜですか?

  14. 14

    %演算子がPythonとJavaで同じように機能しないのはなぜですか?

  15. 15

    ggplotlyがrgplotと同じようにrmarkdownで機能しないのはなぜですか

  16. 16

    Scala:なぜfoo(1,2)とfoo((1,2))が同じように動作するのですか?

  17. 17

    JavaScriptの論理積(&&)がif条件付きと同じように機能しないのはなぜですか?

  18. 18

    2つの異なる単純なリスト変数が互いにまったく同じように動作するのはなぜですか?

  19. 19

    「cp-ra /。b」が同じように動作するのはなぜですか。

  20. 20

    「return」が「console.log()」と同じように機能しないのはなぜですか

  21. 21

    IIf が If/Then/EndIf と同じように機能しないのはなぜですか?

  22. 22

    同じプログラムがWindowsとMacで異なる動作をするのはなぜですか

  23. 23

    戻るボタンとカスタムスクローラー、なぜ2つのWebページで同じように動作しないのですか?

  24. 24

    いつint?とNullable <int>は同じですが、なぜ異なる動作をするのですか?

  25. 25

    f#で実装された型がC#アプリケーションから呼び出されたときにC#型と同じように動作しないのはなぜですか?

  26. 26

    CSSグリッドで、小さい画面サイズで1FR + 9FRが10FRと同じように動作しないのはなぜですか?

  27. 27

    `sum + = x`が整数型の` sum + = * x`と同じように機能するのはなぜですか?これは自動逆参照ですか?

  28. 28

    a =(b ++)がa = b ++と同じ動作をするのはなぜですか?

  29. 29

    findと同じシェルスクリプトで動作しないのはなぜですか?

ホットタグ

アーカイブ