1

列の中央値を超えるすべての値を列自体の中央値に置き換えたいと思います。

ここに私のデータフレームがあります:

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

私はデータフレームに慣れていないので、これをより「パンダ」な方法で、または派手な線形代数を使用して行うことができるかどうか疑問に思っていました.

返信ありがとうございます。


回答を編集:

これは、それぞれ 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 を使用したソリューションの方が速いようです。

ありがとう、今日は np.where と np.minimum という 2 つの強力なことを学びました。

4

2 に答える 2

0

numpy whereapplyを使用して、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
于 2014-08-27T12:14:41.150 に答える