2013-08-30 57 views
8

Tôi có một khung hình bằng dấu phẩy có N cột đại diện cho tọa độ của một vectơ (ví dụ X, Y, Z, nhưng có thể nhiều hơn 3D).Chuẩn dọc theo hàng trong gấu trúc

Tôi muốn tổng hợp khung dữ liệu dọc theo các hàng có chức năng tùy ý kết hợp các cột, ví dụ: chỉ tiêu: (X^2 + Y^2 + Y^2).

tôi muốn làm một cái gì đó tương tự như những gì được thực hiện hereherehere nhưng tôi muốn giữ nó đủ nói chung rằng số lượng các cột có thể thay đổi và nó hoạt động như

DataFrame.mean(axis = 1) 

hoặc

DataFrame.sum(axis = 1) 

Trả lời

9

Tôi tìm thấy một giải pháp nhanh hơn so với những gì @elyase gợi ý:

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

cũng có np.linalg.norm, nhưng vì lý do nào đó "phiên bản thủ công" mà bạn đã cung cấp ở trên nhanh hơn – Wizard

+0

ít nhất trong trường hợp của tôi, điều này có thể được tăng tốc bằng cách làm df.values ​​ – ErroriSalvo

2

lọc các cột theo tên

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

Bạn đang tìm kiếm apply. Ví dụ của bạn sẽ trông giống như sau:

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

Điều này phù hợp với mọi kích thước.

+1

Cảm ơn! Tôi chỉ vấp phải một giải pháp nhanh hơn: 'np.sqrt (np.square (df) .sum (axis = 1))' – Fra

2

NumPy cung cấp định mức ... Sử dụng:

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

ít nhất trong trường hợp của tôi, điều này có thể được tăng tốc khoảng 10% bằng cách làm df.values ​​ – ErroriSalvo

+0

thanx !, thêm mã đó vào sau đó. .. – ntg

Các vấn đề liên quan