Что такое dtype ('O')?

У меня есть dataframe в пандах, и я пытаюсь выяснить, каковы типы его значений. Я не уверен, что тип столбца 'Test'. Однако, когда я запускаю myFrame['Test'].dtype, я получаю;

dtype('O')

Что это значит?

Ответ 1

Это значит:

'O'     (Python) objects

Источник.

Первый символ указывает тип данных, а остальные символы указывают количество байтов на элемент, за исключением Юникода, где оно интерпретируется как количество символов. Размер элемента должен соответствовать существующему типу, или ошибка будет поднята. Поддерживаемые типы относятся к существующему типу или возникает ошибка. Поддерживаемые типы:

'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)

Другой ответ помогает, если нужно проверить type s.

Ответ 2

Это означает "объект python", то есть не один из встроенных скалярных типов, поддерживаемых numpy.

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

Ответ 3

"O" означает объект.

#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')

Строка с оператором печати возвращает следующее: object

Ответ 4

Когда вы видите dtype('O') внутри фрейма данных, это означает строку Pandas.

Что такое dtype?

Что-то, что принадлежит pandas или numpy, или обоим, или что-то еще? Если мы рассмотрим код панд:

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 dtype('O') или объект Pandas, который является строкой типа Python, и это соответствует типам string_ или unicode_.

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

Как Дон Кихот на заднице, Пандас на 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 не изменят столбцы dtype, если мы не установим для всех строк столбцов значение np.nan или None. В этом случае столбец станет float64 или object соответственно.

Вы также можете попробовать установить отдельные строки:

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

И обратите внимание, что если мы установим строку внутри dtype столбца, она станет строкой или объектом dtype.