comment vérifier l'dtype d'une colonne en python pandas
J'ai besoin d'utiliser d'autres fonctions pour traiter numérique des colonnes et des colonnes de la chaîne. Ce que je fais maintenant est vraiment stupide:
allc = list((agg.loc[:, (agg.dtypes==np.float64)|(agg.dtypes==np.int)]).columns)
for y in allc:
treat_numeric(agg[y])
allc = list((agg.loc[:, (agg.dtypes!=np.float64)&(agg.dtypes!=np.int)]).columns)
for y in allc:
treat_str(agg[y])
Est-il une façon plus élégante de le faire? E. g.
for y in agg.columns:
if(dtype(agg[y]) == 'string'):
treat_str(agg[y])
elif(dtype(agg[y]) != 'string'):
treat_numeric(agg[y])
string
n'est pas un dtype
Vous devez vous connecter pour publier un commentaire.
Vous pouvez accéder au type de données d'une colonne avec
dtype
:treat_numeric
fonction. Depuis qu'il a inclusagg.dtypes==np.float64
comme une option, je l'ai fait ainsi.number
ici: docs.scipy.org/doc/numpy-1.13.0/reference/arrays.scalars.html La solution générale estis_numeric_dtype(agg[y])
Dans
pandas 0.20.2
que vous pouvez faire:De sorte que votre code devient:
pandas.core.common.is_numeric_dtype
a existé depuis les Pandas 0.13, et il fait la même chose, mais il a été dépréciée en faveur depandas.api.types.is_numeric_dtype
dans 0.19, je penseJe sais c'est un peu un vieux thread mais avec des pandas 19.02, vous pouvez le faire:
http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.DataFrame.select_dtypes.html
include[np.number]
(qui comprend également des services de renseignements et 32 bits flottants) pour la première ligne etexclude[object]
pour la deuxième ligne. Les chaînes sont des objets autant que dtypes sont concernés. En fait, y compris des "cordes" avec l'objet me donne une erreur.'period'
dtype est la collecte deNotImplementedError
pour l'instant (les pandas 0.24.2). Donc, on peut avoir besoin de quelques faits à la main de post-traitement.Question du titre est général, mais les auteurs de cas d'utilisation indiqué dans le corps de la question est spécifique. De sorte que toute les autres réponses peuvent être utilisés.
Mais afin de répondre pleinement à la question titre il convient de préciser qu'il semble que toutes les approches peuvent échouer dans certains cas et nécessitent une certaine reprise. J'ai passé en revue tous (et quelques autres) en une diminution de la fiabilité de l'ordre (à mon avis):
1. En comparant directement les types de via
==
(accepté réponse).Malgré le fait que c'est accepté de répondre et a plus upvotes comte, je pense que cette méthode ne doit pas être utilisé à tous. Car en fait, cette approche est découragé en python, comme mentionné à plusieurs reprises ici.
Mais si vous voulez continuer à utiliser doivent être conscients de certains pandas spécifiques dtypes comme
pd.CategoricalDType
,pd.PeriodDtype
, oupd.IntervalDtype
. Ici on utiliser destype( )
afin de reconnaître dtype correctement:Un autre inconvénient ici est que le type doit être souligné précisément:
2.
isinstance()
approche.Cette méthode n'a pas été mentionné dans les réponses.
De manière si directe de la comparaison de types n'est pas une bonne idée, qui permet d'essayer python intégrée, à cet effet, à savoir: -
isinstance()
.Il échoue juste au début, parce suppose que nous avons des objets, mais
pd.Series
oupd.DataFrame
peut être utilisé simplement comme des conteneurs vides avec desdtype
mais aucun des objets n':Mais si d'une certaine façon de surmonter ce problème, et souhaite accéder à chaque objet, par exemple, dans la première ligne et vérifie son dtype comme quelque chose comme ça:
Il va être trompeur dans le cas de mélange de type de données dans une seule colonne:
Et le dernier mais non le moindre, cette méthode ne peut pas reconnaître directement
Category
dtype. Comme indiqué dans docs:Donc cette méthode est inapplicable.
3.
df.dtype.kind
approche.Cette méthode peut encore travailler avec vide
pd.Series
oupd.DataFrames
mais a un autre problème.Premier - il est impossible de différer certains dtypes:
Seconde, ce qui est effectivement pas encore clair pour moi, il y a même des retours sur certains dtypes Aucun.
4.
df.select_dtypes
approche.C'est presque ce que nous voulons. Cette méthode conçue à l'intérieur de pandas de sorte qu'il gère la plupart des cas limites mentionnées précédemment, vide DataFrames, diffère numpy ou pandas spécifiques dtypes bien. Il fonctionne bien avec un seul dtype comme
.select_dtypes('bool')
. Il peut être utilisé même pour la sélection des groupes de colonnes sur la base de dtype:Comme, comme indiqué dans le docs:
Sur peut penser qu'ici, nous voyons d'abord inattendue (à l'habitude d'être pour moi: question) les résultats
TimeDelta
est inclus dans la sortieDataFrame
. Mais comme répondu au contraire, il devrait en être ainsi, mais il faut en être conscient. Notez quebool
dtype est ignorée, cela peut être tout aussi indésirable pour quelqu'un, mais c'est en raison debool
etnumber
sont dans différents "les sous-arborescences" de numpy dtypes. Dans le cas booléen, nous pouvons utilisertest.select_dtypes(['bool'])
ici.Prochaine restriction de cette méthode est que pour la version actuelle de pandas (0.24.2), ce code:
test.select_dtypes('period')
va augmenterNotImplementedError
.Et une autre chose est qu'il est impossible de différer les chaînes à partir d'autres objets:
Mais ce n'est, la première déjà mentionné dans les docs. Et le deuxième n'est pas le problème de cette méthode, plutôt la façon dont les chaînes de caractères sont stockées dans
DataFrame
. Mais de toute façon ce cas, ont une certaine post-traitement.5.
df.api.types.is_XXX_dtype
approche.Celui-ci est destiné à être plus robuste et natif de façon à atteindre dtype de reconnaissance (chemin d'accès du module dans lequel les fonctions réside explique par lui-même) comme je suppose. Et il fonctionne presque parfaitement, mais encore au moins une mise en garde, et encore d'une certaine manière de distinguer les colonnes de la chaîne.
D'ailleurs, c'est peut être subjectif, mais cette approche a aussi plus "humaine-compréhensibles"
number
dtypes groupe de traitement en comparant avec.select_dtypes('number')
:Pas
timedelta
etbool
est inclus. Parfait.Mon pipeline exploits exactement cette fonctionnalité à ce moment de temps, plus un peu de post à la main.
De sortie.
Espère que j'ai été en mesure d'argument le principal point que toutes présentées les approches peuvent être utilisés, mais uniquement
pd.DataFrame.select_dtypes()
etpd.api.types.is_XXX_dtype
doit être vraiment considérée comme applicable ceux.Si vous voulez marquer le type d'un dataframe colonne comme une chaîne de caractères, vous pouvez le faire:
Un exemple:
La réponse pour ton code:
Assez de pression pour les types de données des colonnes
Pour vérifier les types de données après, par exemple, une importation à partir d'un fichier
Illustration de sortie: