Pandas条件替换单元格值为每行的平均值/中位数

3

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

以下是问题描述(假设dfval包含浮点数):

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

这看起来很好。接下来我想做的是

dfrank[ dfval < 0.546 ] = dfrank.median(axis=1)

失败了。我找不到一个合适的解决方案,我想我可能在索引方面搞砸了?

非常感谢!


你能提供数据框的一个样例吗? - Bharath M Shetty
dfval 可以像下面这样: dfval = pd.DataFrame({'date':['2000-01-01','2000-01-02','2000-01-03']*3,'id':['a','a','a','b','b','b','c','c','c']}) dfval['val'] = np.random.normal(size=len(dfval)) dfval = dfval.set_index(['date','id'])['val'].unstack() - stan
很抱歉,我弄错了,下面的答案看起来非常好! - stan
1个回答

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

1
非常好的回答,先生。我想不到那些数据。我需要更多的经验。 - Bharath M Shetty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接