2013-08-30 9 views
8

Ich habe ein Pandas Dataframe mit N Spalten, die die Koordinaten eines Vektors (zum Beispiel X, Y, Z, aber könnte mehr als 3D sein).Norm entlang der Reihe in Pandas

Ich möchte den Datenrahmen entlang der Zeilen mit einer beliebigen Funktion, die die Spalten kombiniert, zum Beispiel die Norm: (X^2 + Y^2 + Y^2).

Ich möchte etwas ähnliches tun, was here getan und here und here aber ich will es behalten allgemein genug, dass die Anzahl der Spalten ändern kann, und es verhält sich wie

DataFrame.mean(axis = 1) 

oder

DataFrame.sum(axis = 1) 

Antwort

9

fand ich eine schnellere Lösung als das, was vorgeschlagen @elyase:

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

gibt es auch np.linalg.norm, aber aus irgendeinem Grund die "manuelle Version", die Sie oben geliefert haben ist schneller – Wizard

+0

zumindest in meinem Fall, könnte dies durch df.values ​​beschleunigt werden – ErroriSalvo

2

filtern, die Spalten nach Namen

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

Sie suchen nach apply. Ihr Beispiel würde so aussehen:

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

Dies funktioniert für eine beliebige Anzahl von Dimensionen.

+1

Dank! Ich bin gerade auf eine schnellere Lösung gestoßen: 'np.sqrt (np.square (df) .sum (axis = 1))' – Fra

2

Numpy bietet norm ... Verwendung:

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

zumindest in meinem Fall, könnte dies um etwa 10% beschleunigt werden, indem df.values ​​ – ErroriSalvo

+0

thanx !, fügen Sie es zu Code dann. .. – ntg

Verwandte Themen