Що таке dtype ('O') у пандах?


105

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

dtype('O')

Що це означає?


9
pandasвільно використовує objectdtype, коли стовпці містять змішані значення (рядки, числа, nan).
hpaulj

@quant це означає рядок панди, як я намагався вказати у своїй відповіді
prosti

Відповіді:


106

Це означає:

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

Інша відповідь допомагає, якщо потрібно перевірити types.


19

Коли ви бачите 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')

Ви можете інтерпретувати останній як dtype('O')об'єкт Pandas або Pandas, який є рядком типу Python, і це відповідає Numpy string_, або unicode_типам.

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

Як і Дон Кіхот на дупі, Pandas - на Numpy, а Numpy розуміє основну архітектуру вашої системи і використовує для цього клас numpy.dtype.

Об'єкт типу даних - це екземпляр numpy.dtypeкласу, який більш точно розуміє тип даних, включаючи:

  • Тип даних (ціле число, float, об'єкт Python тощо)
  • Розмір даних (скільки байтів, наприклад, ціле число)
  • Порядок байтів даних (маленький або великий ендіан)
  • Якщо тип даних структурований, це сукупність інших типів даних (наприклад, опис елемента масиву, що складається з цілого числа та поплавця)
  • Назвіть «поля» структури
  • Який тип даних кожного поля
  • Яку частину блоку пам'яті займає кожне поле
  • Якщо тип даних є підмасивом, то яка його форма та тип даних

У контексті цього питання dtypeналежить і до груп, і до нумеру, і, зокрема, 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.


14

Це означає "пітонний об'єкт", тобто не один із вбудованих скалярних типів, підтримуваних numpy.

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

6

'О' означає об'єкт .

#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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.