1
votes

Diviser les colonnes par différentes valeurs dans un bloc de données

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 


2 commentaires

Vos x et y alternent-ils toujours?


@chris oui x et y alternent toujours


4 Réponses :


5
votes

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


0 commentaires

2
votes

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


0 commentaires

0
votes

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)


0 commentaires

0
votes

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')


0 commentaires