2016-09-01 2 views
2

Кажется, я собираюсь кругами, пытаясь решить эту проблему. Я был бы очень благодарен за любую помощь от доверия с помощью stackoverflow.Могу ли я получить обрезанное среднее всех столбцов в фрейме данных с значениями nan?

Проблема в том, что я хочу получить среднее значение для всех столбцов в кадре данных pandas (т. Е. Среднее значение значений в данном столбце, исключая максимальное и минимальное значения). Вполне вероятно, что некоторые столбцы будут иметь значения nan. В принципе, я хочу получить ту же функциональность, что и функция pandas.DataFrame.mean, за исключением того, что это обрезанное среднее.

Очевидным решением является использование функции scipy tmean и итерация по столбцам df. Так что я сделал:

import scipy as sp 

trim_mean = [] 

for i in data_clean3.columns: 
    trim_mean.append(sp.tmean(data_clean3[i])) 

Это отлично работало, пока я не столкнулся с значениями nan, из-за которых tmean задохнулся. Хуже того, когда я сбросил значения nan в кадре данных, были некоторые данные, которые были полностью уничтожены, так как они имели значение nan в каждом столбце. Это означает, что когда я объединю все свои наборы данных в мастер-набор, в главном наборе будут отверстия.

Кто-нибудь знает об этом? Как и в, есть ли способ заставить tmean вести себя как стандартные функции scipy stats и игнорировать значения nan?

(Обратите внимание, что мой код вычисляет большое количество описательных статистических данных о больших массивов данных с ограниченным аппаратным обеспечением; высоко привлеченными или неэффективные методы обхода может быть неоптимальным Надеюсь, хотя, я просто не хватает что-то простое.).

(EDIT: Кто-то предложил в комментарии (который с тех пор исчез?), Что я должен использовать функцию trim_mean scipy, которая позволяет вам загладить и увязать определенную долю данных. Это просто сказать, что это решение выиграло я работаю для меня, так как мои наборы данных имеют неравные размеры, поэтому я не могу указать фиксированную долю данных, которые будут в порядке, чтобы удалить их в каждом случае, всегда должны быть только максимальные и минимальные значения.)

+0

это будет работать для вас '(pd.DataFrame (data_clean3.sum() - data_clean3.max() -. Data_clean3.min()) T) .mean () '. – shivsn

+0

Спасибо, это хороший удар по тому, что мне нужно, но я могу быть проблемой, так как значения max и min могут встречаться более одного раза в каждом столбце. Таким образом, вычитание каждого значения из суммы столбца может неточно отражать обрезанное среднее? – Lodore66

ответ

0

вы colud использовать df.mean (skipna = True) DataFrame.mean

df1 = pd.DataFrame([[5, 1, 'a'], [6, 2, 'b'],[7, 3, 'd'],[np.nan, 4, 'e'],[9, 5, 'f'],[5, 1, 'g']], columns = ["A", "B", "C"]) 
print df1 
df1 = df1[df1.A != df1.A.max()] # Remove max values 
df1 = df1[df1.A != df1.A.min()] # Remove min values 

print "\nDatafrmae after removing max and min\n" 
print df1 
print "\nMean of A\n" 

print df1["A"].mean(skipna =True) 

выход

  A B C 
0 5.0 1 a 
1 6.0 2 b 
2 7.0 3 d 
3 NaN 4 e 
4 9.0 5 f 
5 5.0 1 g 

Datafrmae after removing max and min 

    A B C 
1 6.0 2 b 
2 7.0 3 d 
3 NaN 4 e 

Mean of A 

6.5 
+0

Это удобный подход; Огромное спасибо! По какой-то причине конкретный синтаксис не работал (проблема с версией?), Поэтому я реализовал его вместо этого, перейдя по столбцам и заменив значения max/min на «NaN». То есть «код» для i в data_clean2.столбцы: trimmed_mean.append (data_clean2 [i] .replace (data_clean2 [i] .max(), 'NaN')) 'code' Затем я использовал стандартные значки панд, чтобы получить среднее значение. Спасибо за идею! – Lodore66

1

считает df

np.random.seed() 
data = np.random.choice((0, 25, 35, 100, np.nan), 
         (1000, 2), 
         p=(.01, .39, .39, .01, .2)) 
df = pd.DataFrame(data, columns=list('AB')) 

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

(df.sum() - df.min() - df.max())/(df.notnull().sum() - 2) 

A 29.707674 
B 30.402228 
dtype: float64 

df.mean() 

A 29.756987 
B 30.450617 
dtype: float64 

+0

Спасибо, но как и в случае suvestion shivsn выше, разве это вряд ли окажется проблематичным, если максимальное или минимальное значение происходит более одного раза? – Lodore66

+0

@ Lodore66 Зависит, что вы хотите, если это произойдет более одного раза? – piRSquared

+0

В идеале я хочу, чтобы все экземпляры max/min удалялись из df, так что среднее значение имеет только значения между ними. Я полагаю, что это делает делителем проблему, так как может быть больше двух значений. – Lodore66

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