根据指标创建列的并集

时间:2019-03-04 11:56:53

标签: python pandas

我有一个数据框-

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]

3 个答案:

答案 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']