Qu'est-ce que dtype ('O'), chez les pandas?


106

J'ai un dataframe dans les pandas et j'essaie de comprendre quels sont les types de ses valeurs. Je ne sais pas quel est le type de colonne 'Test'. Cependant, quand je cours myFrame['Test'].dtype, je reçois;

dtype('O')

Qu'est-ce que ça veut dire?


9
pandasutilise librement objectdtype lorsque les colonnes contiennent des valeurs mixtes (chaînes, nombres, nan).
hpaulj

@quant cela signifie une chaîne de pandas comme j'ai essayé de le
montrer

Réponses:


108

Ça veut dire:

'O'     (Python) objects

Source .

Le premier caractère spécifie le type de données et les caractères restants spécifient le nombre d'octets par élément, sauf pour Unicode, où il est interprété comme le nombre de caractères. La taille de l'élément doit correspondre à un type existant, sinon une erreur sera générée. Les types pris en charge sont à un type existant, ou une erreur sera générée. Les types pris en charge sont:

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

Une autre réponse aide si besoin est de vérifier types.


19

Lorsque vous voyez à l' dtype('O')intérieur du dataframe, cela signifie une chaîne de Pandas.

Qu'est-ce que c'est dtype?

Quelque chose qui appartient à pandasou numpy, ou aux deux, ou à autre chose? Si nous examinons le code des 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

Il sortira comme ceci:

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

Vous pouvez interpréter le dernier comme un dtype('O')objet Pandas ou Pandas qui est une chaîne de type Python, et cela correspond à Numpy string_, ou unicode_types.

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

Comme Don Quixote est sur le cul, Pandas est sur Numpy et Numpy comprend l'architecture sous-jacente de votre système et utilise la classe numpy.dtypepour cela.

L'objet de type de données est une instance de numpy.dtypeclasse qui comprend le type de données plus précisément, notamment:

  • Type de données (entier, flottant, objet Python, etc.)
  • Taille des données (combien d'octets sont dans, par exemple, l'entier)
  • Ordre des octets des données (petit-boutiste ou grand-boutiste)
  • Si le type de données est structuré, un agrégat d'autres types de données, (par exemple, décrivant un élément de tableau constitué d'un entier et d'un flottant)
  • Quels sont les noms des "champs" de la structure
  • Quel est le type de données de chaque champ
  • Quelle partie du bloc de mémoire occupe chaque champ
  • Si le type de données est un sous-tableau, quelle est sa forme et son type de données

Dans le contexte de cette question dtypeappartient à la fois aux pands et à numpy et en particulier dtype('O')signifie que nous attendons la chaîne.


Voici un code pour tester avec une explication: Si nous avons l'ensemble de données comme dictionnaire

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)

Les dernières lignes examineront la trame de données et noteront la sortie:

   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

Tout genre de différent dtypes

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

Mais si nous essayons de définir np.nanou Nonecela n'affectera pas le dtype de la colonne d'origine. La sortie sera comme ceci:

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

Donc np.nanou Nonene changera pas les colonnes dtype, sauf si nous définissons toutes les lignes de colonne sur np.nanou None. Dans ce cas, la colonne deviendra float64ou objectrespectivement.

Vous pouvez également essayer de définir des lignes uniques:

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

Et à noter ici, si nous définissons une chaîne dans une colonne non chaîne, elle deviendra une chaîne ou un objet dtype.


14

Cela signifie "un objet python", c'est-à-dire pas un des types scalaires intégrés pris en charge par numpy.

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

6

«O» signifie objet .

#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

La première ligne renvoie: dtype('O')

La ligne avec l'instruction print renvoie ce qui suit: object

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.