python - 按不同范围的因素加权多列
问题描述
我有一个数据框 df,它有 3 列。A、B 和 C。我想创建一个加权平均列,但要测试不同的权重(权重需要等于 100%)。
所以我可以做到;
weights =np.arange(0,1,0.05)
if i+j+k=1:
for i in weights:
for j in weights:
for k in weights:
outname=str(i)+'A'+str(j)+'B'+str(k)+'C'
df[outname]=df['A'].multiply(k)+df['B'].multiply(i)+df['C'].multiply(j)
else:
pass
但是,列数可能会更改为更大的数量。因此,此方法将停止工作。
谁能看到这样做的聪明方法?
解决方案
这是你想要的:
from random import randint
import pandas as pd
df = pd.DataFrame([[0,1,2],[3,4,5],[6,7,8]], columns=['A','B','C'])
weightpool = np.arange(0,1,0.05)
weights = np.linspace(0, 0, num=df.columns.size)
for times in range(1,3):
#all weights sum up to 1
while weights.sum()!=1:
#choose weights out of pool
for i in range(len(weights)-1):
weights[i] = weightpool[randint(0, len(weightpool)-1)]
for i in range(len(weights)-1):
outname = outname + str(weights[i]) + df.columns[i]
outvalue = df[df.columns[i]].multiply(weights[i])
df[outname] = pd.Series(outvalue, index=df.index)
df
推荐阅读
- python-3.x - 我试图使用我制作的类(车辆和客户),但我得到“TypeError:object()不带参数”。我究竟做错了什么?
- reactjs - 如何使用材质 UI 和样式化组件将链接文本更改为粗体且不带下划线?
- numpy - 如何通过矢量化实现将索引列表转换为 numpy 中的单元格列表(numpy 列表数组)?
- apache-spark - 使用 spark-sql 进行查询时显示列名
- java - 该对象未添加到 ArrayList。如何解决这个问题?
- python - 'builtin_function_or_method' 对象不可迭代 - 我的第二个 For 循环有什么问题?
- azure - 使用 Oracle OCI 的 Azure 站点到站点 VPN
- kotlin - 如何在kotlin中使用@ApiResponse注解
- c# - 如何根据内容更改编辑器窗口大小?
- r - 如何使用 which 函数来搜索我的数据框?