2016-02-28 16 views
6

Ich habe einen Pandas Datenrahmen mit spektralen Daten und Metadaten. Die Spalten sind mit einem Multiindex gekennzeichnet, so dass df['wvl'] die Spektren und df['meta'] die Metadaten angibt. Innerhalb von df['wvl'] sind die Spaltenbezeichnungen die Wellenlängenwerte für die Spektrometerkanäle.Normalisieren Reihen von Pandas Datenrahmen durch ihre Summen

Was ich tun möchte, ist jede Zeile von df['wvl'] durch die Summe dieser Zeile zu normalisieren, so dass das Addieren der Werte in der Zeile insgesamt 1.0 ergibt.

Hier ist, was eine Zeile des Datenrahmen wie folgt aussieht:

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 

Aber wenn ich so etwas tun:

df['wvl'].iloc[0]=df['wvl'].iloc[0]/df['wvl'].iloc[0].sum() 

Nichts passiert! Ich bekomme genau die gleichen Werte:

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 

Wenn ich eine temporäre Variable erstellen, die Zeile zu halten, kann ich die Normalisierung ganz gut tun:

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 

Aber wenn ich versuche, den Datenrahmen Reihe zu ersetzen die normierte temporäre Variable, passiert nichts:

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 

ich offensichtlich etwas fehlt hier bin, aber ich kann nicht herausfinden, was und es macht mich verrückt. Hilfe? Danke im Voraus!

+0

Mögliche Duplizieren von [A pandas Datenrahmen für Reihe Normalisieren] (https://stackoverflow.com/questions/18594469/normalizing-a-pandas-dataframe-by-row) –

Antwort

10

können Sie verwenden

df.div(df.sum(axis=1), axis=0) 

df.sum(axis=1) fasst jede Zeile; df.div(..., axis=0) dann teilt.

Beispiel:

import pandas as pd 

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]}) 
>>> df.div(df.sum(axis=1), axis=0) 
    a b 
0 0.250000 0.750000 
1 0.333333 0.666667 
+0

Wow das hat wie ein Zauber funktioniert! Vielen Dank! Könnten Sie mir helfen zu verstehen, warum das, was ich tat, nicht funktionierte? – rba

+0

@ eft773 Also habe ich ein wenig herumgebastelt, und es scheint, als ob das 'iloc' eine Kopie zurückgibt, und daher ändert die Zuweisung nichts daran. Adressiert das Ihre Frage? –

+0

Ahh, ich verstehe. Ich denke, das macht Sinn. Also, im Wesentlichen 'df ['wvl']. Iloc [0]' ist eigentlich kein Teil von df ['wvl'] mehr, also macht das Editieren nichts mehr mit dem Original. Vielen Dank! – rba

Verwandte Themen