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 à pandas
ou 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.dtype
pour cela.
L'objet de type de données est une instance de numpy.dtype
classe 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 dtype
appartient à 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.nan
ou None
cela 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.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 deviendra float64
ou object
respectivement.
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
.
pandas
utilise librementobject
dtype lorsque les colonnes contiennent des valeurs mixtes (chaînes, nombres, nan).