2013-08-30 3 views
8

У меня есть панда Dataframe с N столбцами, представляющими координаты вектора (например, X, Y, Z, но может быть больше 3D).Норма вдоль ряда в пандах

Я хотел бы объединить данные по строкам с произвольной функцией, которая объединяет столбцы, например, норма: (X^2 + Y^2 + Y^2).

Я хочу сделать что-то подобное тому, что делается here и here и here, но я хочу, чтобы это достаточно общее, что число столбцов может измениться, и он ведет себя как

DataFrame.mean(axis = 1) 

или

DataFrame.sum(axis = 1) 

ответ

9

я нашел более быстрое решение, чем то, что @elyase предложил:

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

есть также np.linalg.norm, но по какой-то причине «ручная версия», которую вы указали выше быстрее – Wizard

+0

, по крайней мере, в моем случае это можно было бы ускорить, выполнив df.values ​​ – ErroriSalvo

2

фильтр столбцов по имени

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

Вы ищете apply. Ваш пример будет выглядеть так:

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

Это работает для любого количества измерений.

+1

Спасибо! Я просто наткнулся на более быстрое решение: 'np.sqrt (np.square (df) .sum (axis = 1))' – Fra

2

Numpy обеспечивает норму ... Использование:

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

, по крайней мере, в моем случае это можно было бы ускорить примерно на 10%, выполнив df.values ​​ – ErroriSalvo

+0

thanx !, затем добавьте его в код. .. – ntg

Смежные вопросы