web-dev-qa-db-fra.com

Qu'est-ce que dtype ('O')?

J'ai une base de données dans pandas et j'essaie de déterminer les types de ses valeurs. Je ne suis pas sûr du type de la colonne 'Test'. Cependant, lorsque je lance myFrame['Test'].dtype, je reçois;

dtype('O')

Qu'est-ce que ça veut dire?

64
quant

Ç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, à l'exception de 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 correspondent à un type existant ou une erreur sera générée. Les types supportés 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)

Un autre réponse aide en cas de besoin à vérifier types.

70
jezrael

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

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

'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 retourne: dtype('O')

La ligne avec l'instruction print renvoie: object

5
Jeru Luke

Lorsque vous voyez dtype('O') dans le cadre de données, cela signifie que Pandas chaîne.

Qu'est-ce que dtype?

Quelque chose qui appartient à pandas ou numpy, ou les deux, ou autre chose? Si nous examinons le code 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 va sortir comme ça:

_   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 en tant que Pandas dtype('O') ou Pandas objet qui est Python chaîne de type, et cela correspond à Numpy _string__ ou _unicode__ les types.

_Pandas dtype    Python type     NumPy type          Usage
object          str             string_, unicode_   Text
_

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

L'objet de type de données est une instance de la classe _numpy.dtype_ qui comprend le type de données plus précis , notamment:

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

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


Voici un code de test avec explication: Si nous avons le jeu 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 le cadre de données et noteront le résultat:

_   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
_

Toutes sortes de différentes dtypes

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

Mais si nous essayons de définir _np.nan_ ou None cela n'affectera pas le type de colonne original. Le résultat 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.nan_ ou None ne changera pas les colonnes dtype, sauf si nous définissons toutes les lignes de colonne sur _np.nan_ ou None. Dans ce cas, la colonne devient _float64_ ou object respectivement.

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

_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, celle-ci deviendra une chaîne ou un objet dtype.

4
prosti