pandas条件替换单元格值,平均值/中位数超过行数

时间:2017-10-27 12:19:52

标签: python pandas

我是python的新手,拥有2个(大)未堆叠的pandas数据帧,其中日期为行和列为ids。第一个数据帧包含某些值,而第二个数据帧包含每个值的(行)排名。当值本身满足条件时,我想用行中值替换排名值。

这是问题(假设dfval包含浮点数):

dfrank = (dfval).rank(axis=1,method='first',ascending=False)

这似乎没问题。然后我想做一些像

这样的事情
dfrank[ dfval < 0.546 ] = dfrank.median(axis=1)

失败了。我找不到合适的解决方案,我认为我搞乱了索引?

非常感谢!

1 个答案:

答案 0 :(得分:1)

使用DataFrame.mask

np.random.seed(100)
dfval = pd.DataFrame(np.random.rand(5,5), columns=list('ABCDE'))
print (dfval)
          A         B         C         D         E
0  0.543405  0.278369  0.424518  0.844776  0.004719
1  0.121569  0.670749  0.825853  0.136707  0.575093
2  0.891322  0.209202  0.185328  0.108377  0.219697
3  0.978624  0.811683  0.171941  0.816225  0.274074
4  0.431704  0.940030  0.817649  0.336112  0.175410

dfrank = (dfval).rank(axis=1,method='first',ascending=False)
print (dfrank)
     A    B    C    D    E
0  2.0  4.0  3.0  1.0  5.0
1  5.0  2.0  1.0  4.0  3.0
2  1.0  3.0  4.0  5.0  2.0
3  1.0  3.0  5.0  2.0  4.0
4  3.0  1.0  2.0  4.0  5.0

print (dfrank.median(axis=1))
0    3.0
1    3.0
2    3.0
3    3.0
4    3.0
dtype: float64

dfrank = dfrank.mask(dfval < 0.546 , dfrank.median(axis=1), axis=0)
print (dfrank)
     A    B    C    D    E
0  3.0  3.0  3.0  1.0  3.0
1  3.0  2.0  1.0  3.0  3.0
2  1.0  3.0  3.0  3.0  3.0
3  1.0  3.0  3.0  2.0  3.0
4  3.0  1.0  2.0  3.0  3.0