2015-04-07 5 views
0

Существует ли эффективный способ найти сумму значений, абсолютное значение которых больше медианы строки в кадре данных pandas?сумма значений больше медианы каждой строки в кадрах данных pandas

Например:

 Monday Tuesday Wednesday Thursday Friday Saturday 
0  2.2  4.4  0.5   9   4   3 
1  2   4   1   8   4   5 
2  1.8  4.5  0.9   8   1   15 
3  4   1   5   10  4   5 
… 

Как генерировать сумму чисел в каждой строке, которые больше, чем медиана соответствующей строки? Как насчет 25 процентов или 75 процентов?

ответ

2

И для повышения @ ответ EdChum, чтобы получить квантили:

quantile = 0.75 # 0.25, 0.5, 0.75, etc. 
df[df.gt(df.quantile(q=quantile, axis=1), axis=0)].sum(axis=1) 

Учитывая, что есть только семь дней в неделю, я не уверен, что это будет сделано по назначению, если у вас больше столбцов, чем показано. Вы хотите, чтобы квантиль по столбцу вместо строки?

3

Я думаю, что вы хотите:

In [19]: 

df[df.gt(df.median(axis=1), axis=0)] 
Out[19]: 
    Monday Tuesday Wednesday Thursday Friday Saturday 
0  NaN  4.4  NaN   9  4  NaN 
1  NaN  NaN  NaN   8  NaN   5 
2  NaN  4.5  NaN   8  NaN  15 
3  NaN  NaN   5  10  NaN   5 

Это использует .gt, которая больше и использует в качестве значения median (строчного пропускания оси = 1).

Вы можете позвонить sum на это:

In [20]: 

df[df.gt(df.median(axis=1), axis=0)].sum() 
Out[20]: 
Monday  NaN 
Tuesday  8.9 
Wednesday  5.0 
Thursday  35.0 
Friday  4.0 
Saturday  25.0 
dtype: float64 
+0

И чтобы получить сумму таких значений для строк, просто нажмите на .sum (axis = 1) на ответ Эда выше. – Alexander

+0

Спасибо Эд и Алекс, никогда не использовали '.gt' раньше. Просто из любопытства, можно ли использовать «применять» для реализации той же функции? – user6396

+0

Да, вы могли бы, но я бы посоветовал это сделать, потому что применять медленно, пока это будет векторизовано, применять должно быть последнее средство всегда – EdChum

2

Так как вы хотите, чтобы суммировать значения в каждой строке, которая больше, то медиана, и если вы хотите сохранить ценности день, ниже подход работает отлично

def func(row): 
    return row[row>np.percentile(row, 50)].sum() 

func функция теперь будет применяться на ФР

In [67]: df['rule'] = df.apply(func, axis=1) 

In [68]: df 
Out[68]: 
    Monday Tuesday Wednesday Thursday Friday Saturday rule 
0  2.2  4.4  0.5   9  4   3 17.4 
1  2.0  4.0  1.0   8  4   5 13.0 
2  1.8  4.5  0.9   8  1  15 27.5 
3  4.0  1.0  5.0  10  4   5 20.0 

И для разных квантилей, вы можете использовать [25, 50, 75] в np.percentile(row, x)

+0

спасибо Джон, мне было очень любопытно, как использовать заявку, чтобы реализовать его. – user6396

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