我有两个数据帧:s-1列,d-3列
s = {0: [0, 0.3, 0.5, -0.1, -0.2, 0.7, 0]}
d = {0: [0.1, 0.2, -0.2, 0, 0, 0, 0], 1: [0.3, 0.4, -0.7, 0, 0.8, 0, 0.1], 2: [-0.5, 0.4, -0.1, 0.5, 0.5, 0, 0]}
sd = pd.DataFrame(data=s)
dd = pd.DataFrame(data=d)
result = pd.DataFrame()
我想基于这两个值获取结果数据框(1列):
1.在sd = 0
中输入值时,然后0
2.当sd != 0
中的值时,然后检查dd中是否至少有一个非零值,如果是,则-获得非零平均值,如果没有返回OK
这就是我想要得到的:
results:
0 0
1 -0,033
2 -0,333
3 0,5
4 0,65
5 OK
6 0
我知道我可以使用dd[dd != 0].mean(axis=1)
来计算该行的非零值的平均值,但是我不知道如何将所有这三个条件连接在一起
答案 0 :(得分:1)
两次使用np.where
np.where(sd[0]==0,0,np.where(dd.eq(0).all(1),'OK',dd.mask(dd==0).mean(1)))
Out[232]:
array(['0', '0.3333333333333333', '-0.3333333333333333', '0.5', '0.65',
'OK', '0'], dtype='<U32')
答案 1 :(得分:1)
使用numpy.select
:
c1 = sd[0].eq(0)
c2 = dd.eq(0).all(1)
res = np.select([c1, c2], [0, 'OK'], dd.where(dd.ne(0)).mean(1))
pd.Series(res)
0 0
1 0.3333333333333333
2 -0.3333333333333333
3 0.5
4 0.65
5 OK
6 0
dtype: object
答案 2 :(得分:0)
感谢您的帮助。我以完全不同的方式做到了。 我用过:
res1 = pd.Series(np.where(sd[0]==0, 0, dd[dd != 0].mean(axis=1))).fillna('OK')
区别在于它返回浮点值(对于不是“ OK”的行),而不是字符串。它似乎也快一点。