2016-01-19 5 views
8

Numpyはstrobjectの型を区別しているようです。たとえば、私は:: DTYPE( 'S')とDTYPE( 'O')は、それぞれstrobjectに対応strとオブジェクトの型を区別するパンダ

>>> import pandas as pd 
>>> import numpy as np 
>>> np.dtype(str) 
dtype('S') 
>>> np.dtype(object) 
dtype('O') 

を行うことができます。

しかし、パンダにはその区別がありません。strobjectです。 ::

>>> df = pd.DataFrame({'a': np.arange(5)}) 
>>> df.a.dtype 
dtype('int64') 
>>> df.a.astype(str).dtype 
dtype('O') 
>>> df.a.astype(object).dtype 
dtype('O') 

強制的にタイプをdtype('S')にすることは役に立ちません。 ::

>>> df.a.astype(np.dtype(str)).dtype 
dtype('O') 
>>> df.a.astype(np.dtype('S')).dtype 
dtype('O') 

この動作の説明はありますか?

+3

完全な答えではない簡単な説明: 'numpy'に文字列dtypeを使用すると、それは基本的に固定幅のCのような文字列です。 'pandas'では、それらは"普通の "Python文字列なので、オブジェクト型です。 –

+2

これはあなたの質問に対処するかもしれません - http://stackoverflow.com/questions/21018654/strings-in-a-dataframe-but-dtype-is-object-基本的にオブジェクトndarrayを格納し、ndarrayの文字列は格納しません。しかし、私は、 'str'と 'mixed'カラムを 'O'として区別して区別するなど、タイプを区別するのがより明確になる可能性があることを支持しています。 – Sereger

答えて

12

Numpyの文字列dtypesはPython文字列ではありません。

したがって、pandasは意図的にオブジェクトdtypeを必要とするネイティブのpython文字列を使用します。

まず第一に、私は私が異なっているnumpyのの文字列で何を意味するかのビットを示してみましょう:今すぐ

In [1]: import numpy as np 
In [2]: x = np.array(['Testing', 'a', 'string'], dtype='|S7') 
In [3]: y = np.array(['Testing', 'a', 'string'], dtype=object) 

、「x」はnumpy文字列DTYPE(固定幅、C-のような文字列)で、 yは、ネイティブのPython文字列の配列です。

7文字を超えようとすると、すぐに違いが見えます。文字列DTYPEバージョンが切り捨てられます。

In [6]: y[1] = 'a really really really long' 

In [7]: y 
Out[7]: array(['Testing', 'a really really really long', 'string'], dtype=object) 

次に、ユニコードがあるが|S DTYPEストリングは、適切にUnicodeを保持することはできません:オブジェクトDTYPEバージョンは、任意の長さであることができる

In [4]: x[1] = 'a really really really long' 
In [5]: x 
Out[5]: 
array(['Testing', 'a reall', 'string'], 
     dtype='|S7') 

ものの固定長文字列dtypeも同様です。私は一瞬の例をスキップします。

最後に、numpyの文字列は実際には変更可能ですが、Python文字列は実際には変更可能です。例えば:これらの理由のすべてのための

In [8]: z = x.view(np.uint8) 
In [9]: z += 1 
In [10]: x 
Out[10]: 
array(['Uftujoh', 'b!sfbmm', 'tusjoh\x01'], 
     dtype='|S7') 

pandasはこれまでデータ型としてC状、固定長の文字列を許可しないことを選択しました。あなたが気づいたように、python文字列をfixed-numpy文字列に強制しようとすると、pandasでは機能しません。代わりに、常にネイティブのPython文字列を使用します。これは、ほとんどのユーザーにとってより直観的な方法で動作します。

+1

実際には、パンダはnumpyのような固定長バイト文字列を使用することはほとんどありません。たとえば、 'pd.Series(['a'、 'b'、 'c']、dtype = 'S1')' – mdurant

関連する問題