2013-08-30 14 views
8

Ho un Dataframe panda con N colonne che rappresentano le coordinate di un vettore (ad esempio X, Y, Z, ma potrebbe essere più di 3D).Norm su riga in panda

Vorrei aggregare il dataframe lungo le righe con una funzione arbitraria che combina le colonne, ad esempio la norma: (X^2 + Y^2 + Y^2).

voglio fare qualcosa di simile a ciò che è fatto here e here e here ma voglio tenerlo abbastanza generale che il numero di colonne può cambiare e si comporta come

DataFrame.mean(axis = 1) 

o

DataFrame.sum(axis = 1) 

risposta

9

ho trovato una soluzione più veloce di quello @elyase suggerito:

np.sqrt(np.square(df).sum(axis=1)) 
+0

c'è anche np.linalg.norm, ma per qualche motivo la "versione manuale" che hai fornito sopra è più veloce – Wizard

+0

almeno nel mio caso, questo potrebbe essere accelerato facendo df.values ​​ – ErroriSalvo

2

filtrare le colonne in base al nome

cols = ['X','Y','Z'] 
df[cols].mean(axis=1) 
df[cols].sum(axis=1) 
df[cols].apply(lambda values: sum([v**2 for v in values]), axis=1) 
3

Stai cercando apply. Il tuo esempio sarà simile a questo:

>> df = pd.DataFrame([[1, 1, 0], [1, 0, 0]], columns=['X', 'Y', 'Z']) 
    X Y Z 
0 1 1 0 
1 1 0 0 

>>> df.apply(lambda x: np.sqrt(x.dot(x)), axis=1) 
0 1.414214 
1 1.000000 
dtype: float64 

Questo funziona per qualsiasi numero di dimensioni.

+1

Grazie! Mi sono imbattuto in una soluzione più veloce: 'np.sqrt (np.square (df) .sum (axis = 1))' – Fra

2

Numpy fornisce norma ... Usa:

np.linalg.norm(df[['X','Y','Z']].values,axis=1) 
+1

almeno nel mio caso, questo potrebbe essere accelerato di circa il 10% facendo df.values ​​ – ErroriSalvo

+0

grazie !, aggiungilo al codice allora. .. – ntg

Problemi correlati