2014-08-27 1 views
1

Я хотел бы заменить все значения выше среднего значения столбца на медианное значение самого столбца.Улучшите код, чтобы заменить значения выше медианного по самому среднему значению в pandas DataFrame

Вот мой DataFrame:

m = pd.DataFrame({ 
    'a': xrange(5), 
    'b': xrange(5, 10), 
    'c': xrange(10,15)}) 

print m 

    a b c 
0 0 5 10 
1 1 6 11 
2 2 7 12 
3 3 8 13 
4 4 9 14 

Вот мое решение:

for col in m.columns: 
    quart = m[col].median() 
    m[col] = [val if val < quart else quart for val in m[col]] 

print m 

    a b c 
0 0 5 10 
1 1 6 11 
2 2 7 12 
3 2 7 12 
4 2 7 12 

Я не знаком с кадром данных, так что я был интересно, если это возможно сделать это в более " панды "или с помощью некоторой фантастической линейной алгебры.

Заранее благодарю вас за ответ.


Редактировать ответ:

Вот быстрый timeit для решений от hurrial и chrisb соответственно:

%timeit m.apply(lambda col: np.where(col.median() < col, col.median(), col)) 
1000 loops, best of 3: 1.36 ms per loop 

%timeit np.minimum(m, m.median()) 
1000 loops, best of 3: 400 µs per loop 

Решение с использованием np.minimum кажется быстрее.

Спасибо, что сегодня я научился 2 мощным вещам, np.where и np.minimum!

ответ

0

Существует несколько способов сделать это. В общем, использование понимания списка не является эффективным способом выражения операции pandas - эту конкретную строку можно переписать как (см. indexing docs).

m.loc[m[col] >= val, col] = quart 

Но вся операция может быть записана в одной строке, как это (импортирования numpy as np):

In [211]: m = np.minimum(m, m.median()) 

In [212]: m 
Out[212]: 
    a b c 
0 0 5 10 
1 1 6 11 
2 2 7 12 
3 2 7 12 
4 2 7 12 
0

Вы можете использовать numpy where и apply сделать это для всех столбцов в DataFrame:

import numpy as np 
    import pandas as pd 

    m = pd.DataFrame({ 
     'a': range(5), 
     'b': range(5, 10), 
     'c': range(10,15)}) 

    print(m) 
     a b c 
    0 0 5 10 
    1 1 6 11 
    2 2 7 12 
    3 3 8 13 
    4 4 9 14 

    m.apply(lambda col: np.where(col.median()>col, col.median(), col)) 

    print(m) 

     a b c 
    0 2 7 12 
    1 2 7 12 
    2 2 7 12 
    3 3 8 13 
    4 4 9 14 

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

  • Нет связанных вопросов^_^