J'ai besoin d'utiliser différentes fonctions pour traiter les colonnes numériques et les colonnes de chaînes. 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])
Y a-t-il une manière plus élégante de faire cela? Par exemple
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 dtypeRéponses:
Vous pouvez accéder au type de données d'une colonne avec
dtype
:la source
treat_numeric
. Puisqu'il a inclusagg.dtypes==np.float64
en option, je l'ai fait aussi.number
dessous: docs.scipy.org/doc/numpy-1.13.0/reference/arrays.scalars.html La solution générale estis_numeric_dtype(agg[y])
En
pandas 0.20.2
vous pouvez faire:Ainsi votre code devient:
la source
pandas.core.common.is_numeric_dtype
existe depuis Pandas 0.13, et il fait la même chose, mais il a été déconseillé en faveur de la versionpandas.api.types.is_numeric_dtype
0.19, je penseJe sais que c'est un peu un vieux fil mais avec pandas 19.02, vous pouvez faire:
http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.DataFrame.select_dtypes.html
la source
include[np.number]
(pour inclure également les entiers et les flottants 32 bits) pour la première ligne etexclude[object]
pour la deuxième ligne. Les chaînes sont des objets en ce qui concerne les dtypes. En fait, inclure 'string' avec object me donne une erreur.'period'
dtype augmenteNotImplementedError
pour l'instant (pandas 0.24.2). Donc, on peut avoir besoin d'un post-traitement à la main.Le titre de la question posée est général, mais le cas d'utilisation des auteurs indiqué dans le corps de la question est spécifique. Donc, toutes les autres réponses peuvent être utilisées.
Mais pour répondre pleinement à la question du titre, il convient de préciser qu'il semble que toutes les approches peuvent échouer dans certains cas et nécessiter quelques retouches. Je les ai tous examinés (et certains supplémentaires) par ordre décroissant de fiabilité (à mon avis):
1. Comparaison des types directement via
==
(réponse acceptée).Malgré le fait que cette réponse est acceptée et que la plupart des votes positifs comptent, je pense que cette méthode ne devrait pas du tout être utilisée. Car en fait cette approche est déconseillée en python comme mentionné à plusieurs reprises ici .
Mais si l' on veut encore utiliser - devrait être au courant de certains comme dtypes pandas géants-spécifiques de
pd.CategoricalDType
,pd.PeriodDtype
oupd.IntervalDtype
. Ici, il faut utiliser un supplémenttype( )
pour reconnaître correctement dtype:Une autre mise en garde ici est que ce type doit être souligné avec précision:
2.
isinstance()
approche.Cette méthode n'a pas encore été mentionnée dans les réponses.
Donc, si la comparaison directe des types n'est pas une bonne idée - essayons la fonction python intégrée à cet effet, à savoir -
isinstance()
.Cela échoue juste au début, car suppose que nous avons des objets, mais
pd.Series
oupd.DataFrame
peuvent être utilisés comme de simples conteneurs vides avec desdtype
objets prédéfinis mais pas d'objets:Mais si l'on surmonte ce problème d'une manière ou d'une autre, et veut accéder à chaque objet, par exemple, dans la première ligne et vérifie son dtype comme quelque chose comme ça:
Ce sera trompeur dans le cas de type mixte 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 la documentation :Donc, cette méthode est également presque inapplicable.
3.
df.dtype.kind
approche.Cette méthode peut encore fonctionner avec vide
pd.Series
oupd.DataFrames
mais présente d'autres problèmes.Premièrement, il est impossible de différer certains types de dtypes:
Deuxièmement, ce qui n'est pas encore clair pour moi, il revient même sur certains dtypes Aucun .
4.
df.select_dtypes
approche.C'est presque ce que nous voulons. Cette méthode est conçue à l'intérieur des pandas afin de gérer la plupart des cas de coin mentionnés précédemment - les DataFrames vides, diffère bien des dtypes numpy ou spécifiques aux pandas. Cela fonctionne bien avec un seul dtype comme
.select_dtypes('bool')
. Il peut être utilisé même pour sélectionner des groupes de colonnes en fonction de dtype:Comme tel, comme indiqué dans la documentation :
On peut penser que nous voyons ici les premiers résultats inattendus (auparavant pour moi: question ) -
TimeDelta
est inclus dans la sortieDataFrame
. Mais comme il a répondu au contraire, il devrait en être ainsi, mais il faut en être conscient. Notez quebool
dtype est ignoré, ce qui peut également être indésirable pour quelqu'un, mais cela est dû àbool
et senumber
trouve dans différents " sous-arbres " de dtypes numpy. Dans le cas de bool, nous pouvons utilisertest.select_dtypes(['bool'])
ici.La prochaine restriction de cette méthode est que pour la version actuelle de pandas (0.24.2), ce code:
test.select_dtypes('period')
augmenteraNotImplementedError
.Et une autre chose est qu'il ne peut pas différer les chaînes des autres objets:
Mais c'est, d'abord - déjà mentionné dans la documentation. Et deuxièmement, ce n'est pas le problème de cette méthode, mais plutôt la façon dont les chaînes sont stockées
DataFrame
. Mais de toute façon, ce cas doit avoir un post-traitement.5.
df.api.types.is_XXX_dtype
approche.Celui-ci est destiné à être le moyen le plus robuste et le plus natif de réaliser la reconnaissance de type dtype (chemin du module où les fonctions résident dit par lui-même) comme je suppose. Et cela fonctionne presque parfaitement, mais il reste au moins une mise en garde et doit encore distinguer les colonnes de chaînes .
En outre, cela peut être subjectif, mais cette approche a également un
number
traitement de groupe dtypes plus `` compréhensible par l' homme '' par rapport à.select_dtypes('number')
:Non
timedelta
etbool
est inclus. Parfait.Mon pipeline exploite exactement cette fonctionnalité à ce moment, plus un peu de traitement post-manuel.
Production.
J'espère avoir pu argumenter le point principal - que toutes les approches discutées peuvent être utilisées, mais seulement
pd.DataFrame.select_dtypes()
etpd.api.types.is_XXX_dtype
devraient être vraiment considérées comme les approches applicables.la source
Si vous souhaitez marquer le type d'une colonne de dataframe comme une chaîne, vous pouvez faire:
Un exemple:
La réponse à votre code:
la source
Pour bien imprimer les types de données de colonne
Pour vérifier les types de données après, par exemple, une importation depuis un fichier
Sortie illustrative:
la source