我希望将列中值以上的所有值替换为列本身的中值。
这是我的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
我对数据框架并不熟悉,所以我想知道是否可以在更多的“熊猫”中做到这一点。方式或使用一些花哨的线性代数。
提前感谢您的回复。
编辑答案:
这里分别是来自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!
答案 0 :(得分: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
答案 1 :(得分: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