IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

pandas series : trouver valeur non numérique [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 206
    Par défaut pandas series : trouver valeur non numérique
    Bonjour,
    j'ai un objet series Pandas contenant d'abord des valeurs numériques puis une chaîne de caractère et encore des valeurs numériques.
    Je voudrais extraire de cette série la première partie numérique, soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test = pd.Series([1, 2, 3, "date", 5, 6, 7])
    et obtenir finalement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test = pd.Series([1, 2, 3])
    ce, en repérant l'index de la valeur non numérique.
    Je bloque ! Pouvez vous m'orienter svp ?
    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 206
    Par défaut
    J'ai trouvé cette méthode mais il y a certainement plus élégant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    idx = test[test =="date"].index[0]
    test = test[0:idx-1]

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 206
    Par défaut
    Puis ce ne sera pas toujours cette chaîne de caractère là. Il me faudrait un truc du genre isnumeric mais je ne sais si ça existe

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par cpalperou Voir le message
    Puis ce ne sera pas toujours cette chaîne de caractère là. Il me faudrait un truc du genre isnumeric mais je ne sais si ça existe
    Oui ça existe mais sur les strings. Exemple "5".isnumeric() renvoie vrai.
    Donc solution: transformer chaque valeur en string puis tester si la string est numérique: test = pd.Series(x for x in test if str(x).isnumeric()).
    Autre solution: garder les éléments "non strings": test = pd.Series(x for x in test if not isinstance(x, str)).
    Autre solution: garder les éléments int (et peut-être float s'il y en a): test = pd.Series(x for x in test if isinstance(x, (int, float))).

    Donc en effet il y a plus élégant.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 206
    Par défaut
    Merci beaucoup pour vos propositions effectivement bien plus élégante.
    Toutefois, il me semble que vos solutions permettent de garder toutes les valeurs numériques et de supprimer les strings. Je souhaite en fait, garder uniquement la 1ère partie numérique.
    Dès qu'il y a un string : stop !
    Dans mon exemple du 1er test, je voudrais obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test = pd.Series([1, 2, 3])
    .
    Encore merci

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cpalperou Voir le message
    Toutefois, il me semble que vos solutions permettent de garder toutes les valeurs numériques et de supprimer les strings.
    Exact. C'est ce qu'on nomme "liste en intension", où on écrit une liste 2 à partir d'un traitement direct sur une liste 1. Là le traitement c'est "garder les int/float" donc effectivement on garde tout.

    Citation Envoyé par cpalperou Voir le message
    Je souhaite en fait, garder uniquement la 1ère partie numérique.
    Dès qu'il y a un string : stop !
    Pas compliqué mais là on ne peut plus passer en liste par intension. Là il faut écrire l'algorithme complet qui crée une seconde série à partir d'une boucle sur la première et qui stoppe dès que l'élément n'est plus bon. Ensuite on remplace la première par la seconde.
    Mais bon, écrire un algo de ce type c'est normalement faisable par n'importe quel débutant Python...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import pandas as pd
    test = pd.Series([1, 2, 3, "date", 5, 6, 7])
     
    tmp=list()
    for t in test:
    	if not isinstance(t, int): break
    	tmp.append(t)
    # for
     
    test=pd.Series(tmp)
    print(test)

    Une fois qu'on a l'algo, on peut alors chercher plus élégant. Mais déjà c'est quoi plus élégant en Python? Plus élégant c'est moins de variables, moins d'instructions tout en gardant la lisibilité (donc pas de lignes énormes). Par exemple ici c'est éviter le append() gros consommateur. On peut par exemple incrémenter un indice et quitter quand l'élément n'est plus bon. Suffit alors de récupérer ensuite ce qui ne va que jusqu'à l'indice
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import pandas as pd
    test = pd.Series([1, 2, 3, "date", 5, 6, 7])
     
    for (i, t) in enumerate(test):
    	if not isinstance(t, int): break
     
    test=pd.Series(test[:i])
    print(test)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 31/03/2013, 20h28
  2. Suppression des valeurs non numériques
    Par sniper75 dans le forum SAS Base
    Réponses: 10
    Dernier message: 28/01/2013, 15h10
  3. Réponses: 4
    Dernier message: 23/12/2010, 09h35
  4. Récupérer valeur non numérique d'un spreadsheet
    Par timeis dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 15/10/2010, 09h38
  5. [WPF] Storyboard et valeurs non numérique
    Par Invité dans le forum Framework .NET
    Réponses: 3
    Dernier message: 19/11/2007, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo