我有一个数据框-
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元素和list元素相乘在一起,然后选择前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]
答案 0 :(得分:1)
如果我对您的理解正确,我认为先前的答案不完整,因此这是一种解决方案。它涉及使用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']
答案 1 :(得分:0)
尝试一下:
dict1 = {'a':[1,2,4], 'b': [0,3,5],'c':[1,1,1]} # arrays must all be same length
df = pd.DataFrame(dict1)
list1 = [('a', 0.91), ('b', 5), ('c', 2)]
df2 = pd.DataFrame({k : [j*v[1] for j in dict1[k]] for k in dict1 for v in list1 if k == v[0]})
"""
df2 should be like this :
a b c
0 0.91 0 2
1 1.82 15 2
2 3.64 25 2
"""
答案 2 :(得分:0)
IIUC,您需要:
a = [('a', 0.91), ('b', 5), ('c', 2)]
m= df.mul(pd.DataFrame(a).set_index(0)[1])
a b c
0 0.91 0.0 2.0
1 1.82 15.0 2.0
2 3.64 25.0 2.0
在每一行上应用排名并取总和,然后对索引进行排序并找到所需的输出。
m.rank(axis=1,method='dense').sum().sort_values().index.tolist()
#['a', 'c', 'b']