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?
Ç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 type
s.
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')
'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
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:
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
.