2016-02-28 14 views
6

Ho un dataframe panda contenente dati spettrali e metadati. Le colonne sono etichettate con un multiindice in modo che df['wvl'] dia gli spettri e df['meta'] fornisca i metadati. Entro df['wvl'] le etichette di colonna rappresentano i valori di lunghezza d'onda per i canali dello spettrometro.Normalizza le righe del frame di dati panda in base alle somme

Quello che voglio fare è normalizzare ogni riga di df['wvl'] con la somma di quella riga in modo che sommando i valori nella riga dia un totale di 1.0.

Ecco cosa una riga della dataframe assomiglia:

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 

Ma quando faccio qualcosa di simile:

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

Niente succede! Ottengo gli esatti valori stessi:

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 

Se creo una variabile temporanea per contenere la riga, posso fare la normalizzazione bene:

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 

Ma se provo a sostituire la riga dataframe con la variabile temporanea normalizzato, non succede nulla:

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 

sono ovviamente manca qualcosa qui, ma non riesco a capire cosa e sta guidando me insane. Aiuto? Grazie in anticipo!

+0

Possibile duplicato di [normalizzazione un dataframe panda per riga] (https://stackoverflow.com/questions/18594469/normalizing-a-pandas-dataframe-by-row) –

risposta

10

È possibile utilizzare

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

df.sum(axis=1) riassume ogni riga; df.div(..., axis=0) quindi divide.

Esempio:

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 , ha funzionato come un fascino! Grazie! Potresti aiutarmi a capire perché quello che stavo facendo non funzionava? – rba

+0

@ eft773 Così ho armeggiato un po ', e sembra che 'iloc' sta restituendo una copia, e quindi l'assegnazione ad esso non cambia nulla. Questo indirizzo la tua domanda? –

+0

Ah, capisco. Penso che abbia senso. Quindi, essenzialmente 'df ['wvl']. Iloc [0]' non è più una parte di df ['wvl'], quindi la modifica non fa nulla rispetto all'originale. Grazie! – rba

Problemi correlati