2015-04-20 2 views
2

Я видел несколько решений, которые приближаются к решению моей проблемыУдалить выбросы (+/- 3 Std) и заменить np.nan в Python/панд

link1 link2

, но они не помогли до сих пор я преуспеваю.

Я считаю, что следующее решение, что мне нужно, но по-прежнему получаю сообщение об ошибке (и я не имею очки репутации комментировать/вопрос об этом): link

(я получаю следующее сообщение об ошибке , но я не понимаю, куда .copy() или добавьте «inplace=True» при введении следующей команды df2=df.groupby('install_site').transform(replace):

SettingWithCopyWarning:. значение пытается установить на копию кусочка из DataFrame Попробуйте использовать .loc[row_indexer,col_indexer] = value вместо

Смотрите на предостережения в документации: link

SO, я пытался придумать свою версию, но я продолжаю застревать. Вот оно.

У меня есть фрейм данных, индексированный по времени со столбцами для сайта (строковые значения для многих разных сайтов) и значениями float.

time_index   site  val 

Я хотел бы пройти через колонку «» VAL, сгруппированных по сайту, и заменить любые выбросы (те +/- 3 стандартных отклонений от среднего значения) с NaN (для каждой группы).

Когда я использую следующую функцию, я не могу индексировать кадр данных с моим вектором Истинного/Falses:

def replace_outliers_with_nan(df, stdvs): 
    dfnew=pd.DataFrame() 
    for i, col in enumerate(df.sites.unique()): 
     dftmp = pd.DataFrame(df[df.sites==col]) 
     idx = [np.abs(dftmp-dftmp.mean())<=(stdvs*dftmp.std())] #boolean vector of T/F's 
     dftmp[idx==False]=np.nan #this is where the problem lies, I believe 
     dfnew[col] = dftmp 
    return dfnew 

Кроме того, я боюсь, что данная функция будет занимать очень много времени на 7 миллионов + строк , поэтому я надеялся использовать функцию groupby function.

+0

Эта ошибка, которую вы получаете, является просто предупреждением. Кажется, что он иногда появляется, даже когда операция завершается успешно. Вы проверяли, работает ли этот метод, несмотря на сообщение? – BrenBarn

ответ

5

Если я понял вас правильно, нет необходимости перебирать столбцы. Это решение заменяет все значения, отклоняющие более трех стандартных стандартных отклонений с NaN.

def replace(group, stds): 
    group[np.abs(group - group.mean()) > stds * group.std()] = np.nan 
    return group 

# df is your DataFrame 
df.loc[:, df.columns != group_column] = df.groupby(group_column).transform(lambda g: replace(g, 3)) 
+0

Большое спасибо @RickardSjogren. Это отлично работает! Я получаю ошибку indexing-view-versus-copy, но она работает в конце. Очень признателен!! –

+0

Вы могли бы предложить способ применить это независимо к каждому столбцу кадра данных (т. Е. Заменить значения, равные> 3std из среднего для каждого столбца)? Я изо всех сил пытаюсь заставить его работать, и у меня заканчивается пустой блок данных. –

+0

Я надеялся, что вы сможете мне помочь с приведенным выше, @RickardSjogren –

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