Reconciliation de données via la methode SwapLevel
Afin d’illustrer l’utilisation du swaplevel, on va imaginer 2 dataframes (firstReport & secondReport) dont il faut comparer les colonnes.
secondReport = pd.DataFrame([ [1, 5, 'Eric'], [1, 10, 'Eric'], [1, 30, 'Marc'], [1, 5, 'Bob'], [2, 40, 'Eric'], [2, 15, 'Bob']], columns = ['IncidentNumber','TimeSpent','User'])
La première étape consiste à concaténer les DataFrames horizontalement avec la fonction de concaténation et à distinguer chaque trame avec le paramètre keys
df_all = pd.concat([firstReport.set_index('IncidentNumber'), secondReport.set_index('IncidentNumber'), axis='columns', keys=['First', 'Second'])
Il est probablement plus facile d’échanger les niveaux des colonnes et de mettre les mêmes noms de colonnes les uns à côté des autres:
Methode Apply
Allons un peu plus loin dans la reconciliation entre les deux rapports, afin de mettre en valeur la plus grande période passé sur un incident.
On écrit dabords une méthode adapté…
def highlightGreaterTimeSpent(data,column): redColor = 'color: {}'.format('red') #other is the other dataframe to compare with other = data.xs(column, axis='columns', level=-1) return pd.DataFrame(np.where(data.gt(other, level=0), redColor, ''), index=data.index, columns=data.columns)
… qu’on applique à notre df_final
df_final = df_final.reset_index(drop=True).style \ .apply(highlightGreaterTimeSpent,column='First', axis=None) \ .apply(highlightGreaterTimeSpent,column='Second',axis=None)
Notons le caractère de continuation de ligne \
La nécessité de ce style devient plus évidente à mesure que les noms de méthode s’allongent et que les méthodes commencent à prendre des arguments.