Python Pandas DataFrame行相对权重设置最大值0.5的实现问题
错误原因
你写的transform传入的lambda函数中,x是一整列的Series对象,x/sum(x)会返回一个和列等长的数值Series,直接用if < 0.5做判断时,程序无法对一组布尔值统一返回分支结果,因此触发报错。
解决方法
最简单的方案是先计算无上限的相对权重,再用Pandas内置的clip方法截断超过0.5的数值,完全符合你的需求:
import pandas as pd df1 = pd.DataFrame({ 'Dates':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05'], 'ID1':[0,0,2,1,1], 'ID2':[1,3,1,1,2], 'ID3':[1,0,0,1,0], 'ID4':[1,1,7,1,0], 'ID5':[0,6,0,0,1]}) # 先计算无上限相对权重 df1 = df1.set_index('Dates').T df2 = df1.transform(lambda x: x/sum(x)).T # 截断上限为0.5,得到结果 df3 = df2.clip(upper=0.5).round(2) print(df3)
运行后输出和你给出的预期结果完全一致。
如果你想要在transform步骤里直接完成上限控制,可以用Series的where方法实现条件替换,写法如下:
df3 = df1.transform(lambda x: (x/sum(x)).where(lambda s: s < 0.5, 0.5)).T.round(2)
内容的提问来源于stack exchange,提问作者fjurt
相关产品推荐
相关产品推荐

