web-dev-qa-db-ja.com

dtype( 'O')とは何ですか?

pandasにデータフレームがあり、その値のタイプが何であるかを把握しようとしています。列'Test'のタイプが不明です。ただし、myFrame['Test'].dtypeを実行すると、取得します。

dtype('O')

これは何を意味するのでしょうか?

64
quant

その意味は:

'O'     (Python) objects

ソース

最初の文字はデータの種類を指定し、残りの文字はアイテムごとのバイト数を指定します。ただし、Unicodeは例外で、文字数として解釈されます。アイテムのサイズは既存のタイプに対応している必要があります。対応していない場合、エラーが発生します。サポートされている種類は既存の種類のものであるか、エラーが発生します。サポートされている種類は次のとおりです。

'b'       boolean
'i'       (signed) integer
'u'       unsigned integer
'f'       floating-point
'c'       complex-floating point
'O'       (Python) objects
'S', 'a'  (byte-)string
'U'       Unicode
'V'       raw data (void)

別の answer は、typesを確認する必要がある場合に役立ちます。

70
jezrael

これは、「pythonオブジェクト」を意味します。つまり、numpyでサポートされている組み込みスカラー型のいずれでもありません。

np.array([object()]).dtype
=> dtype('O')
11
shx2

「O」はobjectを表します。

#Loading a csv file as a dataframe
import pandas as pd 
train_df = pd.read_csv('train.csv')
col_name = 'Name of Employee'

#Checking the datatype of column name
train_df[col_name].dtype

#Instead try printing the same thing
print train_df[col_name].dtype

最初の行は以下を返します:dtype('O')

Printステートメントを含む行は、次を返します。object

5
Jeru Luke

データフレーム内にdtype('O')が表示される場合、これはPandas文字列を意味します。

dtypeとは何ですか?

pandasまたはnumpy、あるいはその両方に属するもの、または何か他のものですか? pandasコードを調べると:

df = pd.DataFrame({'float': [1.0],
                    'int': [1],
                    'datetime': [pd.Timestamp('20180310')],
                    'string': ['foo']})
print(df)
print(df['float'].dtype,df['int'].dtype,df['datetime'].dtype,df['string'].dtype)
df['string'].dtype

次のように出力されます。

   float  int   datetime string    
0    1.0    1 2018-03-10    foo
---
float64 int64 datetime64[ns] object
---
dtype('O')

最後は、Pandasタイプの文字列であるPandas dtype('O')またはPythonオブジェクトとして解釈できます。これは、Numpy string_またはunicode_タイプに対応します。

Pandas dtype    Python type     NumPy type          Usage
object          str             string_, unicode_   Text

Don Quixoteがロバにいるように、PandasはNumpyにあり、Numpyはシステムの基礎となるアーキテクチャを理解し、そのためにクラス numpy.dtype を使用します。

データ型オブジェクトは、以下を含むデータ型より正確なを理解するnumpy.dtypeクラスのインスタンスです。

  • データのタイプ(整数、フロート、Pythonオブジェクトなど)
  • データのサイズ(整数のバイト数など)
  • データのバイト順(リトルエンディアンまたはビッグエンディアン)
  • データ型が構造化されている場合、他のデータ型の集合(例:整数と浮動小数点で構成される配列項目の記述)
  • 構造の「フィールド」の名前は何ですか
  • 各フィールドのデータ型は何ですか
  • 各フィールドがメモリブロックのどの部分を取るか
  • データ型がサブ配列の場合、その形状とデータ型は何ですか

この質問のコンテキストでは、dtypeはpandsとnumpyの両方に属し、特にdtype('O')は文字列を期待することを意味します。


説明付きのテスト用のコードを次に示します。データセットを辞書として持っている場合

import pandas as pd
import numpy as np
from pandas import Timestamp

data={'id': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}, 'date': {0: Timestamp('2018-12-12 00:00:00'), 1: Timestamp('2018-12-12 00:00:00'), 2: Timestamp('2018-12-12 00:00:00'), 3: Timestamp('2018-12-12 00:00:00'), 4: Timestamp('2018-12-12 00:00:00')}, 'role': {0: 'Support', 1: 'Marketing', 2: 'Business Development', 3: 'Sales', 4: 'Engineering'}, 'num': {0: 123, 1: 234, 2: 345, 3: 456, 4: 567}, 'fnum': {0: 3.14, 1: 2.14, 2: -0.14, 3: 41.3, 4: 3.14}}
df = pd.DataFrame.from_dict(data) #now we have a dataframe

print(df)
print(df.dtypes)

最後の行では、データフレームを調べて、出力に注意します。

   id       date                  role  num   fnum
0   1 2018-12-12               Support  123   3.14
1   2 2018-12-12             Marketing  234   2.14
2   3 2018-12-12  Business Development  345  -0.14
3   4 2018-12-12                 Sales  456  41.30
4   5 2018-12-12           Engineering  567   3.14
id               int64
date    datetime64[ns]
role            object
num              int64
fnum           float64
dtype: object

あらゆる種類のdtypes

df.iloc[1,:] = np.nan
df.iloc[2,:] = None

ただし、np.nanまたはNoneを設定しようとしても、元の列のdtypeには影響しません。出力は次のようになります。

print(df)
print(df.dtypes)

    id       date         role    num   fnum
0  1.0 2018-12-12      Support  123.0   3.14
1  NaN        NaT          NaN    NaN    NaN
2  NaN        NaT         None    NaN    NaN
3  4.0 2018-12-12        Sales  456.0  41.30
4  5.0 2018-12-12  Engineering  567.0   3.14
id             float64
date    datetime64[ns]
role            object
num            float64
fnum           float64
dtype: object

したがって、すべての列行をnp.nanまたはNoneに設定しない限り、np.nanまたはdtypeは列Noneを変更しません。その場合、列はそれぞれfloat64またはobjectになります。

単一の行を設定することもできます:

df.iloc[3,:] = 0 # will convert datetime to object only
df.iloc[4,:] = '' # will convert all columns to object

また、ここで注意するのは、文字列以外の列に文字列を設定すると、文字列またはオブジェクトdtypeになります。

4
prosti