J'ai besoin de normaliser mes données en divisant x et y par la largeur et la hauteur.
X / largeur et y / hauteur
Exemple de DataFrame d'entrée:
ID X1n Y1n X2n Y2n X3n Y3n X4n Y4n X5n Y5n 1 .5 .2 .5 .2 .5 .2 .5 .2 .5 .2 2 .5 .2 .5 .2 .5 .2 .5 .2 .5 .2
4 Réponses :
Avec filter code> les colonnes en fonction de leurs noms et exécutant update :
ID X1n Y1n X2n Y2n X3n Y3n X4n Y4n X5n Y5n 0 1 0.5 0.2 0.5 0.2 0.5 0.2 0.5 0.2 0.5 0.2 1 2 0.5 0.2 0.5 0.2 0.5 0.2 0.5 0.2 0.5 0.2
Sortie:
df.update(df.filter(like='X').div(df['Width'],0))
df.update(df.filter(like='Y').div(df['Height'],0))
df = df.drop(columns=['Width','Height']).add_suffix('n').rename(columns={'IDn':'ID'})
df
La mise à jour sera problématique s'il vous manque des mesures de largeur ou de hauteur car elle n'écrasera pas l'original avec NaN.
ID X1n Y1n X2n Y2n X3n Y3n X4n Y4n X5n Y5n 0 1 0.5 0.2 0.5 0.2 0.5 0.2 0.5 0.2 0.5 0.2 1 2 0.5 0.2 0.5 0.2 0.5 0.2 0.5 0.2 0.5 0.2
Out:
XXX
Lorsque vous avez des colonnes comme X1, X2, X123, etc.,
X1n X2n X3n X4n X5n Y1n Y2n Y3n Y4n Y5n Height Width ID 0 0.5 0.5 0.5 0.5 0.5 0.2 0.2 0.2 0.2 0.2 10 2 1 1 0.5 0.5 0.5 0.5 0.5 0.2 0.2 0.2 0.2 0.2 10 2 2
Donne:
pd.concat([df.filter(regex='^X\d+').div(df.loc[0,'Width']),
df.filter(regex='^Y\d+').div(df.loc[0,'Height']) ],axis=1)\
.rename(columns=lambda x: x+'n')\
.assign(Height = df.Height.values[0])\
.assign(Width= df.Width.values[0])\
.assign(ID = df.ID)
Une autre méthode possible pourrait être de compresser les colonnes après avoir appliqué filter () et pandas.concat ():
dfX= df.filter(regex= 'X').div(df['Width'],axis =0)
dfY =df.filter(regex= 'Y').div(df['Height'],axis =0)
df= pd.concat([dfX,dfY], axis = 1)
df_final = df[[col for elem in list(zip(dfX.columns, dfY.columns)) for col in elem]].add_suffix('n')
Vos x et y alternent-ils toujours?
@chris oui x et y alternent toujours