首页 > 解决方案 > 基于度量创建列的联合

问题描述

我有一个数据框-

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]

标签: pythonpandas

解决方案


如果我理解正确,我认为以前的答案不完整,所以这里有一个解决方案。它涉及使用我希望你接受的 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']

推荐阅读