Normaliser les lignes de pandas trame de données par leurs sommes
J'ai une pandas dataframe contenant des données spectrales et les métadonnées. Les colonnes sont étiquetés avec un multiindex de sorte que df['wvl']
donne les spectres et df['meta']
donne les métadonnées. Dans df['wvl']
les étiquettes de colonne sont de la longueur d'onde des valeurs pour le spectromètre de canaux.
Ce que je veux faire est de normaliser chaque ligne de df['wvl']
par la somme de la ligne de sorte que l'addition des valeurs dans la ligne, donne un total de 1,0.
Voici ce qu'une ligne de la dataframe ressemble:
df['wvl'].iloc[0]
246.050003 128.533035
246.102005 102.756321
246.156006 99.930775
...
848.697205 121.313347
848.896423 127.011662
849.095703 123.234168
Name: 0, dtype: float64
Mais quand je fais quelque chose comme:
df['wvl'].iloc[0]=df['wvl'].iloc[0]/df['wvl'].iloc[0].sum()
Rien ne se passe! J'obtiens exactement les mêmes valeurs:
df['wvl'].iloc[0]
246.050003 128.533035
246.102005 102.756321
246.156006 99.930775
...
848.697205 121.313347
848.896423 127.011662
849.095703 123.234168
Name: 0, dtype: float64
Si je créer une variable temporaire pour contenir la ligne, je peux faire la normalisation parfaitement:
temp=df['wvl'].iloc[0]
temp=temp/temp.sum()
temp
246.050003 0.000027
246.102005 0.000022
246.156006 0.000021
...
848.697205 0.000026
848.896423 0.000027
849.095703 0.000026
Name: 0, dtype: float64
Mais si j'essaie de remplacer le dataframe ligne avec le normalisée variable temporaire, rien ne se passe:
df['wvl'].iloc[0]=temp
df['wvl'].iloc[0]
246.050003 128.533035
246.102005 102.756321
246.156006 99.930775
...
848.697205 121.313347
848.896423 127.011662
849.095703 123.234168
Name: 0, dtype: float64
Je suis évidemment manque quelque chose ici, mais je ne peux pas comprendre quoi et ça me conduire fou. De l'aide? Merci à l'avance!
OriginalL'auteur rba | 2016-02-28
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
df.sum(axis=1)
les sommes de chaque ligne;df.div(..., axis=0)
divise ensuite.Exemple:
J'ai donc bricolé un peu, et il semble que le
iloc
est de retour une copie, et, par conséquent, l'affectation à cela ne change rien. Est-ce à l'adresse de votre question?Ahh, je vois. Je pense que cela a du sens. Donc, essentiellement
df['wvl'].iloc[0]
n'est pas en fait une partie de df['wvl'] de plus, afin d'édition, il ne fait rien à l'original. Merci!!!!OriginalL'auteur Ami Tavory