python - 基于度量创建列的联合
问题描述
我有一个数据框-
df = pd.DataFrame({'a':[1,2,4], 'b': [0,3,5],'c':[1,1,1,1]})
a b c
0 1 0 1
1 2 3 1
2 4 5 1
和一个清单[('a', 0.91), ('b', 5), ('c', 2)]
。
现在我想创建另一个数据框,它遍历每一行并将 df 元素和列表元素相乘,然后选择前 2 个分数并创建一个具有所述列名的新列表。
例如在第一行我们有 -
1*0.9=0.9 , 0*5=0 , 1*2=2
因此前 2 列是 a 和 c,所以我们将它们附加到一个新列表中。
第二行——
2*0.9=1.8, 3*5=15,1*2=2
因此list=[a,c,b]
等等……
第三排——
4*0.9=3.6,5*5=25,1*2=2
所以列表保持不变[a,c,b]
所以最终输出是[a,c,b]
解决方案
如果我理解正确,我认为以前的答案不完整,所以这里有一个解决方案。它涉及使用我希望你接受的 numpy。
创建权重:
n = [('a', 0.91), ('b', 5), ('c', 2)]
d = { a:b for a,b in n}
weights = [d[i] for i in df.columns]
然后我们创建一个权重乘以的表:
df = pd.DataFrame({'a':[1,2,4], 'b': [0,3,5],'c':[1,1,1]})
df = df*weights
这产生:
a b c
0 0.9 0.0 2.0
1 1.8 15.0 2.0
2 3.6 25.0 2.0
然后我们可以在 numpy 中获得前两个索引:
b = np.argsort(df.values,axis=1)
b = b[:,-2:]
这产生:
array([[0, 2],
[2, 1],
[0, 1]], dtype=int64)
最后我们可以计算出现的顺序并返回列名:
c =b.reshape(-1)
_, idx = np.unique(c, return_index=True)
d = c[np.sort(idx)]
print(list(df.columns[d].values))
这产生:
['a', 'c', 'b']
推荐阅读
- ms-access - 是否有 VBA 代码(用于 Access 2016)来创建空白/任何 PNG 文件
- laravel - Laravel Eloquent - 如何获得嵌套关系
- python - 在 Python/IronPython 中包含现有代码片段
- directx - DirectCompute 着色器 (HLSL) 具有奇怪的数组大小
- azure - 使用 Mongo API 在 Cosmos DB 中的共享吞吐量集合上创建唯一索引
- python - 如何使用 MXE 交叉编译 64 位 Python
- c# - JSON的部分对象反序列化
- python-3.x - 根据从另一列的最大值返回的最小年份值按列分组
- amazon-sagemaker - AWS SageMaker Notebook 实例无法连接到 Internet
- python - JupyterLab - 如何找出我的会话在哪个 python venv 上运行?