2013-08-30 16 views
8

Mam pandas Dataframe z N kolumnami reprezentującymi współrzędne wektora (na przykład X, Y, Z, ale może być więcej niż 3D).Norma wzdłuż rzędu w pandach

Chciałbym agregować ramkę danych wzdłuż wierszy z dowolną funkcją, która łączy w sobie kolumny, na przykład normę: (X^2 + Y^2 + Y^2).

chcę zrobić coś podobnego do tego, co odbywa here i here i here ale chcę zachować go na tyle ogólne, że liczba kolumn można zmienić, a zachowuje się jak

DataFrame.mean(axis = 1) 

lub

DataFrame.sum(axis = 1) 

Odpowiedz

9

znalazłem szybsze rozwiązanie niż to, co @elyase zasugerował:

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

istnieje również np.linalg.norm, ale z jakiegoś powodu "wersja manualna", którą dostarczyłeś powyżej jest szybszy – Wizard

+0

przynajmniej w moim przypadku, może to być przyspieszone przez zrobienie df.values ​​ – ErroriSalvo

2

filtrować kolumny wg nazwy

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

Szukasz apply. Twój przykład może wyglądać tak:

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

Działa to dla dowolnej liczby wymiarów.

+1

Dzięki! Po prostu natknąłem się na szybsze rozwiązanie: 'np.sqrt (np.square (df) .sum (axis = 1))' – Fra

2

Numpy przewiduje norma ... użyć:

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

przynajmniej w moim przypadku, może to być przyspieszone o około 10%, wykonując df.values ​​ – ErroriSalvo

+0

thanx !, dodaj to do kodu następnie. .. – ntg