Le projet sur lequel je travaille m'oblige à découvrir quel «projet» a été mis à jour depuis la dernière fois qu'il a été traité. A cet effet, j'ai deux dataframes qui contiennent tous deux trois colonnes, dont la dernière est une date indiquant la dernière mise à jour d'un projet. Le premier dataframe est dérivé d'une requête sur une table de base de données qui enregistre la date à laquelle un «projet» est mis à jour. La seconde concerne les métadonnées que je stocke moi-même dans une table différente à propos de la dernière fois que ma partie de l'application a traité un projet.

Je pense que je suis venu assez loin mais je suis bloqué sur l'erreur suivante, voir le code fourni ci-dessous:

lastmatch = pd.DataFrame({
    'projectid': ['1', '2', '2', '3'],
    'stage': ['c', 'c', 'v', 'v'],
    'lastmatchdate': ['2020-08-31', '2013-11-24', '2013-11-24',
                      '2020-08-31']
})
lastmatch['lastmatchdate'] = pd.to_datetime(lastmatch['lastmatchdate'])

processed = pd.DataFrame({
    'projectid': ['1', '2'],
    'stage': ['c', 'v'],
    'process_date': ['2020-08-30', '2013-11-24']
})
processed['process_date'] = pd.to_datetime(
    processed['process_date']
)

unprocessed = lastmatch[~lastmatch.isin(processed)].dropna()

processed.set_index(['projectid', 'stage'], inplace=True)
lastmatch.set_index(['projectid', 'stage'], inplace=True)

processed.sort_index(inplace=True)
lastmatch.sort_index(inplace=True)

print(lastmatch['lastmatchdate'])
print(processed['process_date'])

to_process = lastmatch.loc[lastmatch['lastmatchdate'] > processed['process_date']]

Le résultat que je veux obtenir est un dataframe contenant les lignes où la 'lastmatchdate' est supérieure à la date de dernier traitement du projet (process_date). Cependant cette ligne:

to_process = lastmatch.loc[lastmatch['lastmatchdate'] > processed['process_date']]

Produit un ValueError: Can only compare identically-labeled Series objects. Je pense que c'est peut-être une syntaxe que je ne connais pas ou que je me trompe.

La sortie que j'attends est dans ce cas:

                lastmatchdate
projectid stage              
1         c        2020-08-31

Donc, concrètement, la question est: comment obtenir un dataframe contenant uniquement les lignes d'un autre dataframe ayant la valeur (datetime) de la colonne a supérieure à la colonne b de l'autre dataframe.

1
Roel van Endhoven 31 août 2020 à 18:40

2 réponses

Meilleure réponse
merged = pd.merge(processed, lastmatch, left_index = True, right_index = True)
merged = merged.assign(to_process = merged['lastmatchdate']> merged['process_date'])

Vous obtiendrez les éléments suivants:

                process_date lastmatchdate  to_process
projectid stage                                       
1         c       2020-08-31    2020-08-31       False
2         v       2013-11-24    2013-11-24       False
1
lrh09 31 août 2020 à 15:56

Vous avez le receveur ValueError parce que vous avez essayé de comparer deux dataframes différentes, si vous voulez comparer ligne par ligne deux dataframes, fusionnez-les avant

 lastmatch = pd.DataFrame({
        'projectid': ['1', '2', '2', '3'],
        'stage': ['c', 'c', 'v', 'v'],
        'lastmatchdate': ['2020-08-31', '2013-11-24', '2013-11-24',
                          '2020-08-31']
    })
    lastmatch['lastmatchdate'] = pd.to_datetime(lastmatch['lastmatchdate'])
    
    processed = pd.DataFrame({
        'projectid': ['1', '2'],
        'stage': ['c', 'v'],
        'process_date': ['2020-08-30', '2013-11-24']
    })
    processed['process_date'] = pd.to_datetime(
        processed['process_date']
    )
    
    df=pd.merge(lastmatch,processed,on=['stage','projectid'])
    
    df=df[
        df.lastmatchdate>df.process_date
    ]
    print(df)
      projectid stage lastmatchdate process_date
0         1     c    2020-08-31   2020-08-30
1
sygneto 31 août 2020 à 15:57