2013-08-04 62 views
9

Tôi có dữ liệu được tải vào một khung dữ liệu có chứa một chỉ mục đa cho các tiêu đề cột. Hiện nay tôi đã được nhóm các dữ liệu bằng các chỉ số cột để lấy giá trị trung bình của các nhóm và tính toán khoảng tin cậy 95% như thế này:Lỗi chuẩn bỏ qua NaN trong nhóm nhóm gấu trúc

from pandas import * 
import pandas as pd 
from scipy import stats as st 

#Normalize to starting point then convert 
normalized = (data - data.ix[0]) * 11.11111 
#Group normalized data based on slope and orientation 
grouped = normalized.groupby(level=['SLOPE','DEPTH'], axis=1) 
#Obtain mean of each group 
means = grouped.mean() 
#Calculate 95% confidence interval for each group 
ci = grouped.aggregate(lambda x: st.sem(x) * 1.96) 

nhưng vấn đề với điều này là chức năng trung bình được sử dụng trên các nhóm bỏ qua các giá trị NaN trong khi hàm stipse của hàm scipy trả về NaN nếu có một NaN trong nhóm. Tôi cần tính toán sai số chuẩn trong khi bỏ qua NaN như hàm trung bình.

Tôi đã cố gắng đi về tính khoảng tin cậy 95% như thế này:

#Calculate 95% confidence interval for each group 
ci = grouped.aggregate(lambda x: np.std(x)/??? * 1.96) 

std trong NumPy sẽ cho tôi độ lệch chuẩn bỏ qua các giá trị NaN nhưng tôi cần phải chia này bằng căn bậc hai của nhóm kích thước bỏ qua NaNs để có được lỗi tiêu chuẩn.

Cách dễ nhất để tính sai số chuẩn khi bỏ qua NaN là gì?

+0

cố gắng để bao gồm trong 'groupby của bạn () 'function this:' normalized.groupby (by = [col_name_with_NaN], mức = ['SLOPE', 'DEPTH'], trục = 1) ', sao cho' Giá trị NaN' sẽ không xuất hiện trong 'nhóm ' –

+0

Có 36 cột và có thể có NaN tại bất kỳ hàng nào. dữ liệu bị mất. Bạn có đề xuất chuyển danh sách tất cả các tên cột không? Đối số by = [] làm gì? Tôi đã nhìn xung quanh nhưng dường như không thể hiểu được điều này. – pbreach

+0

Có, thử chuyển tất cả các tên cột '36' thành đối số' by'. Tôi không chính xác những gì đối số này không, nhưng nó lọc NaN ... –

Trả lời

8

count() phương pháp Series đối tượng sẽ trở lại không đếm giá trị NaN:

import pandas as pd 
s = pd.Series([1,2,np.nan, 3]) 
print s.count() 

đầu ra:

3 

Vì vậy, hãy thử:

ci = grouped.aggregate(lambda x: np.std(x)/x.count() * 1.96) 
+0

Làm việc như một sự quyến rũ! cảm ơn bạn. – pbreach

+5

'grouped.aggregate (lambda x: np.std (x, ddof = 1) /np.sqrt (x.count()))' – Noah

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