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 :

Boucle sur Dataframe [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Septembre 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2019
    Messages : 9
    Par défaut Boucle sur Dataframe
    Bonjour,

    Je suis entrain de travaillé sur plusieurs dataframe assez lourdes sur python.

    J'ai deux tables

    df1_na, c'est ma table d'opération avec des informations de station et d'heure
    df1_2, c'est ma datable de méteo avec un relevé sur une station et toutes les heures


    J'ai plusieurs station dans mes fichier et je cherche a faire un truc annuel, donc plusieurs mois.
    Mon objectif c'est que pour chaque couple origin_code et actual_time je trouve mon humidité, ma température et mon point de rosé

    Pour trouver l'heure la plus proche je prend juste le direct supérieur. C'est plus simple.

    J'ai commencer a codé avec une boucle, sauf que c'est vraiment super long. Est ce quelqu'un a une idée pour passer par une fonction.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    while x<len(df1_na):
        df1_2=df1_3
        Station=df1_na.iloc[x,df1_na.columns.get_loc('origin_code')]
        Day=df1_na.iloc[x,df1_na.columns.get_loc('actual_time')]
        ### On construit une liste de date autour de la date que l'on cherche
        Date=df1_na.iloc[x,df1_na.columns.get_loc('actual_day')]
        Date2=Date+timedelta(days=1)
        Date1=Date-timedelta(days=1)
        Liste_date=[]
        Liste_date.append(Date1)
        Liste_date.append(Date)
        Liste_date.append(Date2)
     
     
        ###On filtre par Station puis par date avec les deux jour entourant la date que l'on cherche. 
        df1_2=df1_2[(df1_2.station==Station)]
        df1_2=df1_2[(df1_2['day'].isin(Liste_date))]
        df1_2=df1_2[(df1_2.time>=Day)]
        df1_2.sort_values(by=['time'],ascending=True)
     
        if len(df1_2)>0:
            df1_na.iloc[x,df1_na.columns.get_loc('humidité')]=df1_2.iloc[0,df1_2.columns.get_loc('rel_humidity')]
            df1_na.iloc[x,df1_na.columns.get_loc('température')]=df1_2.iloc[0,df1_2.columns.get_loc('temp_c')]
            df1_na.iloc[x,df1_na.columns.get_loc('point de rosée')]=df1_2.iloc[0,df1_2.columns.get_loc('dew_point_c')]
            print((x/len(df1_na))*100)
            compteur_1+=1
     
        x+=1
    J'ai essayé avec d'autre fonction style iterrows, mais ça ne fonctionne pas.

    Merci d'avance.

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    perso j'ai pas tout compris, tu pourrais prendre quelques données d'exemple (éventuellement fictives/simplifiées) et montrer ce que tu attends en sortie ?

  3. #3
    Membre habitué
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Septembre 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2019
    Messages : 9
    Par défaut
    Bonsoir,

    Je vais essayer d'être plus clair. Ma première base c'est df1_na avec eux info importante

    origin_code actual_time
    LEAS 03/06/2018 09:59
    EBBR 06/06/2018 07:25
    FNLU 07/06/2018 16:05
    LLBG 03/06/2018 09:04
    KEWR 04/06/2018 06:04
    LLBG 04/06/2018 23:04
    KEWR 05/06/2018 12:36

    et ma deuxième table

    Nom : mete.JPG
Affichages : 738
Taille : 55,7 Ko

    Et je dois prendre les 3 colonnes de la deuxième table et la mettre dans la première avec l'heure la plus proche.

    J'ai plusieurs station et un mois de données.

    Est-ce que c'est plus clair ?

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par Julien_VBA Voir le message
    Est ce que c'est plus clair ?
    plus ou moins, du coup je reprends une partie de ton jeu de données et te propose un truc de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    import pandas as pd
     
    df1_na = pd.DataFrame([ ['LEAS', '03/06/2018 08:08'],
                            ['LEAS', '03/06/2018 09:09'],
                            ['LEAS', '03/06/2018 10:10'],
                            ['LEAS', '03/06/2018 11:11']],
                          columns = ['origin_code', 'actual_time'])
    df1_na['actual_time'] = pd.to_datetime(df1_na['actual_time'], format='%d/%m/%Y %H:%M')
     
    df1_2 = pd.DataFrame([
        ['03/06/2018', 'LEAS',  9, 15.0, 100.0, 15.0, '03/06/2018 08:00'],
        ['03/06/2018', 'LEAS',  1, 14.0,  94.0, 15.0, '03/06/2018 08:30'],
        ['03/06/2018', 'LEAS', 18, 14.0,  94.0, 15.0, '03/06/2018 08:37'],
        ['03/06/2018', 'LEAS', 47, 14.0, 100.0, 14.0, '03/06/2018 08:52'],
        ['03/06/2018', 'LEAS', 19, 14.0, 100.0, 14.0, '03/06/2018 09:00'],
        ['03/06/2018', 'LEAS', 16, 14.0, 100.0, 14.0, '03/06/2018 09:09'],
        ['03/06/2018', 'LEAS', 48, 14.0, 100.0, 14.0, '03/06/2018 09:30'],
        ['03/06/2018', 'LEAS',  7, 13.0,  94.0, 14.0, '03/06/2018 10:00'],
        ['03/06/2018', 'LEAS', 14, 13.0,  94.0, 14.0, '03/06/2018 10:23'],
        ['03/06/2018', 'LEAS', 17, 13.0,  94.0, 14.0, '03/06/2018 10:30'],
        ['03/06/2018', 'LEAS', 35, 13.0,  94.0, 14.0, '03/06/2018 10:47'],
        ['03/06/2018', 'LEAS', 33, 13.0,  94.0, 14.0, '03/06/2018 11:00'],
    ], columns = ['day', 'station', 'daily_report', 'dew_point', 'rel_humidity', 'temp_c', 'time'])
    df1_2['day'] = pd.to_datetime(df1_2['day'], format='%d/%m/%Y')
    df1_2['time'] = pd.to_datetime(df1_2['time'], format='%d/%m/%Y %H:%M')
     
    def f(x):
        return df1_na.loc[(df1_na[(df1_na['origin_code'] == x['station'])]['actual_time'] - x['time']).abs().idxmin()]['actual_time']
     
    df1_2['closest_time'] = df1_2.apply(f, axis=1)
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
              day station  daily_report  dew_point  rel_humidity  temp_c                  time         closest_time
    0  2018-06-03    LEAS             9       15.0         100.0    15.0   2018-06-03 08:00:00  2018-06-03 08:08:00
    1  2018-06-03    LEAS             1       14.0          94.0    15.0   2018-06-03 08:30:00  2018-06-03 08:08:00
    2  2018-06-03    LEAS            18       14.0          94.0    15.0   2018-06-03 08:37:00  2018-06-03 08:08:00
    3  2018-06-03    LEAS            47       14.0         100.0    14.0   2018-06-03 08:52:00  2018-06-03 09:09:00
    4  2018-06-03    LEAS            19       14.0         100.0    14.0   2018-06-03 09:00:00  2018-06-03 09:09:00
    5  2018-06-03    LEAS            16       14.0         100.0    14.0   2018-06-03 09:09:00  2018-06-03 09:09:00
    6  2018-06-03    LEAS            48       14.0         100.0    14.0   2018-06-03 09:30:00  2018-06-03 09:09:00
    7  2018-06-03    LEAS             7       13.0          94.0    14.0   2018-06-03 10:00:00  2018-06-03 10:10:00
    8  2018-06-03    LEAS            14       13.0          94.0    14.0   2018-06-03 10:23:00  2018-06-03 10:10:00
    9  2018-06-03    LEAS            17       13.0          94.0    14.0   2018-06-03 10:30:00  2018-06-03 10:10:00
    10 2018-06-03    LEAS            35       13.0          94.0    14.0   2018-06-03 10:47:00  2018-06-03 11:11:00
    11 2018-06-03    LEAS            33       13.0          94.0    14.0   2018-06-03 11:00:00  2018-06-03 11:11:00
    libre à toi de t'en inspirer

  5. #5
    Membre habitué
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Septembre 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2019
    Messages : 9
    Par défaut
    Merci beaucoup.

    Je vais tester ça de ce pas.

    J'avais essayé de créer plusieurs fonction mais j'avais pas pensé à créer une nouvelle colonne pour pouvoir faire un merge après.

    Je te remercie vraiment.

    Je note résolue quand ça marchera dans l'après midi.

    Merci

  6. #6
    Membre habitué
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Septembre 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2019
    Messages : 9
    Par défaut
    Re bonjour,

    J'ai adapter ma fonction mais je me rend compte que j'ai des stations unique dans chacune des tables donc python me renvoie une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def f2(x):
        try: 
            return df1_na.loc[(df1_na[(df1_na['origin_code']==x['station'])]['actual_day'] - x['time']).abs().idxmin()]['actual_day']
        except(ValueError, IndexError):
            return None

    J'ai l'erreur suivant :

    TypeError: ("cannot do label indexing on <class 'pandas.core.indexes.numeric.Int64Index'> with these indexers [nan] of <class 'float'>", 'occurred at index 4894')
    Je ne sais pas du d'ou ça vient...

    Merci d'avance

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

Discussions similaires

  1. Boucle sur des noms de colonnes d'un dataframe
    Par discus23 dans le forum R
    Réponses: 4
    Dernier message: 26/10/2018, 10h19
  2. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  3. [JDBC]Boucle sur tous les éléments du ResultSet
    Par Terminator dans le forum JDBC
    Réponses: 1
    Dernier message: 22/09/2005, 19h30
  4. L'installation d'XP boucle sur elle-même
    Par pf106 dans le forum Windows XP
    Réponses: 13
    Dernier message: 20/08/2005, 14h55
  5. [MFC] Boucle sur un bouton
    Par karl3i dans le forum MFC
    Réponses: 6
    Dernier message: 17/02/2004, 11h37

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