2016-10-02 3 views
2

Есть ли простой способ рассчитать среднее значение для каждого столбца в pandas DataFrame и для каждой строки исключить значение? x в каждой строке ниже отмечает значение в каждой итерации, чтобы исключить из расчета:Средняя функция, исключая значение для каждой строки в Pandas DataFrame

a b      a b     a b 
0 1 2     0 x x    0 1 2 
1 2 4 first loop 1 2 4 second loop 1 x x etc. 
2 3 6  --->  2 3 6  --->  2 3 6 ---> 
3 4 8     3 4 8    3 4 8 
4 5 10     4 5 10    4 5 10 
          ____________    _____________ 
        col_avg: 3.5 7.0  col_avg: 3.25 6.5 

Using only 4 values at each iteration, as the "x" is excluded from data set 

, в результате чего новый DataFrame

a_x b_x 
0 3.5 7.0 
1 3.25 6.5 
2 3.0 6.0 
3 2.75 5.5 
4 2.5 5.0 

Благодаря

/N

ответ

3

К начнем с первого шага, скажем, нас интересовали суммирование вместо вычисления средних значений. В этом случае мы будем добавлять все элементы вдоль каждого столбца, за исключением текущего элемента. Другой способ взглянуть на это/решить это было бы суммировать все элементы вдоль каждого столбца и вычесть текущий элемент. Таким образом, по существу мы могли бы получить сумму для всех столбцов с df.sum(0) и просто вычесть из нее df, держа ось выровненной. Broadcasting позаботится о выполнении этих операций через все колоды за один раз.

Чтобы получить второй шаг усреднения, мы просто делим на количество элемнов, участвующих в суммировании каждого столбца, т. Е. df.shape[0]-1.

Таким образом, мы получили бы векторизованную решение, как так -

df_out = (df.sum(0) - df)/float(df.shape[0]-1) 

Пример запуска -

In [128]: df 
Out[128]: 
    a b 
0 1 2 
1 2 4 
2 3 6 
3 4 8 
4 5 10 

In [129]: (df.sum(0) - df)/float(df.shape[0]-1) 
Out[129]: 
     a b 
0 3.50 7.0 
1 3.25 6.5 
2 3.00 6.0 
3 2.75 5.5 
4 2.50 5.0 

Чтобы установить имена столбцов искомыми, сделайте следующее: df_out.columns = ['a_x','b_x'].

+0

Спасибо, работает отлично! Поскольку данные содержат значения NaN, среднее значение «истина» должно рассчитываться с использованием df.count() вместо df_shape [0], так как в противном случае я бы считал NaN как фактические значения. Однако я не указал это в вопросе, но только FYI. – gussilago

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