Co to jest dtype („O”) u pand?

106

Mam ramkę danych w pandach i próbuję dowiedzieć się, jakie są typy jej wartości. Nie jestem pewien, jaki jest typ kolumny 'Test'. Jednak kiedy biegnę myFrame['Test'].dtype, dostaję;

dtype('O')

Co to znaczy?

Quant
źródło
9
pandasswobodnie używa objectdtype, gdy kolumny zawierają wartości mieszane (łańcuchy, liczby, nan).
hpaulj
@quant oznacza ciąg pand, jak próbowałem wskazać w mojej odpowiedzi
prosti

Odpowiedzi:

107

To znaczy:

'O'     (Python) objects

Źródło .

Pierwszy znak określa rodzaj danych, a pozostałe znaki określają liczbę bajtów na element, z wyjątkiem Unicode, gdzie jest on interpretowany jako liczba znaków. Rozmiar pozycji musi odpowiadać istniejącemu typowi, w przeciwnym razie zostanie zgłoszony błąd. Obsługiwane rodzaje należą do istniejącego typu lub zostanie zgłoszony błąd. Obsługiwane rodzaje to:

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

Inna odpowiedź pomaga w razie potrzeby sprawdzić types.

jezrael
źródło
19

Kiedy widzisz dtype('O')wewnątrz dataframe, oznacza to ciąg Pandas.

Co to jest dtype?

Coś, co należy do pandaslub numpy, lub oba, czy coś innego? Jeśli zbadamy kod pandy:

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

Wyświetli się w ten sposób:

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

Możesz zinterpretować ostatni jako obiekt Pandy dtype('O')lub Pandy, który jest łańcuchem typu Python, a to odpowiada Numpy string_lub unicode_typom.

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

Tak jak Don Kichot jest na dupie, Pandas jest na Numpy, a Numpy rozumie podstawową architekturę twojego systemu i używa do tego klasy numpy.dtype.

Typ danych obiekt jest instancją numpy.dtypeklasy, które zrozumieć dane wpisać bardziej precyzyjny w tym:

  • Typ danych (liczba całkowita, zmiennoprzecinkowa, obiekt Pythona itp.)
  • Rozmiar danych (ile bajtów zawiera np. Liczba całkowita)
  • Kolejność bajtów danych (little-endian lub big-endian)
  • Jeśli typ danych ma strukturę, agregacja innych typów danych (np. Opisująca element tablicy składający się z liczby całkowitej i zmiennoprzecinkowej)
  • Jakie są nazwy „pól” konstrukcji
  • Jaki jest typ danych w każdym polu
  • Którą część bloku pamięci zajmuje każde pole
  • Jeśli typ danych jest tablicą podrzędną, jaki jest jej kształt i typ danych

W kontekście tego pytania dtypenależy zarówno do pands, jak i numpy iw szczególności dtype('O')oznacza, że ​​oczekujemy ciągu.


Oto kod do testowania wraz z wyjaśnieniem: Jeśli mamy zbiór danych jako słownik

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)

Ostatnie wiersze zbadają ramkę danych i zanotują wynik:

   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

Wszystkie inne dtypes

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

Ale jeśli spróbujemy ustawić np.nanlub Nonenie wpłynie to na oryginalny typ kolumny. Wynik będzie taki:

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

Więc np.nanlub Nonenie zmieni kolumn dtype, chyba że ustawimy wszystkie wiersze kolumn na np.nanlub None. W takim przypadku kolumna stanie się odpowiednio float64lub object.

Możesz też spróbować ustawić pojedyncze wiersze:

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

Warto zauważyć, że jeśli ustawimy ciąg wewnątrz kolumny niebędącej ciągiem znaków, stanie się on ciągiem lub obiektem dtype.

prosti
źródło
14

Oznacza „obiekt Pythona”, tj. Nie jest to jeden z wbudowanych typów skalarnych obsługiwanych przez numpy.

np.array([object()]).dtype
=> dtype('O')
shx2
źródło
6

„O” oznacza obiekt .

#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

Pierwsza linia zwraca: dtype('O')

Wiersz z instrukcją print zwraca: object

Jeru Luke
źródło