Python 数据帧获取列组合最大值

Python 数据帧获取列组合最大值,python,pandas,statistics,Python,Pandas,Statistics,我有一个熊猫数据框,如下所示 df=pd.DataFrame({“A”:[3,1,2,4,5,3,4,10],“B”:[1,3,2,4,0,0,1,0]}) 行值0到10为建议值(10为最佳值)。一个数据帧列是与0到10建议相关的类别(a、B等)。所有类别都具有相同的权重,但每行与一个项目相关 我希望对数据帧进行排序,使最大值组合到两个(或更多)类别中。因此,如果与某个项目相关的行在类别a中的值为10,但在类别B中的值为0,那么对于最高评级的项目,这将不是预期的解决方案。在上面给出的示例中,值为

我有一个熊猫数据框,如下所示

df=pd.DataFrame({“A”:[3,1,2,4,5,3,4,10],“B”:[1,3,2,4,0,0,1,0]})

行值0到10为建议值(10为最佳值)。一个数据帧列是与0到10建议相关的类别(a、B等)。所有类别都具有相同的权重,但每行与一个项目相关

我希望对数据帧进行排序,使最大值组合到两个(或更多)类别中。因此,如果与某个项目相关的行在类别a中的值为10,但在类别B中的值为0,那么对于最高评级的项目,这将不是预期的解决方案。在上面给出的示例中,值为[4,4]的行是最佳选择

我的groupby解决方案没有给出预期的结果

grouped = df.groupby(['A', 'B'])
grouped[["A", "B"]].max().sort(ascending=False)
结果:

        A   B
A   B       
10  2   10  0
5   0   5   0
4   4   4   4
    1   4   1
3   1   3   1
    0   3   0
2   2   2   2
1   3   1   3
基于行的总和也不会产生预期的结果,因为它不区分类别。

这如何

df['pos'] = df.A/df.A.mean() + df.B/df.B.mean()
df.sort( columns='pos', ascending=False)

#    A  B       pos
#3   4  4  3.909091
#7  10  0  2.500000
#1   1  3  2.431818
#2   2  2  1.954545
#6   4  1  1.727273
#0   3  1  1.477273
#4   5  0  1.250000
#5   3  0  0.750000
如果您有更多的列要排序,
['A'、'B'、'C'、…]

cols = ['A','B'] # ,'C', 'D', ... ]
df['pos'] = pandas.np.sum([ df[col]/df[col].mean() for col in cols ],axis=0)
更新 因为0被认为是一个质量值(最低),我将修改我的答案如下(不确定它是否会产生巨大的差异)

然后计算数据帧中每列的秩

rank = df.rank(method = "dense")
rank

Out[44]:
    A   B
0   3   2
1   1   4
2   2   3
3   4   5
4   5   1
5   3   1
6   4   2
7   6   1
向数据框中添加一个新列,该列是基于所有类别的总排名

df['total_rank'] = rank.sum(axis = 1)
df


Out[46]:
    A   B   total_rank
0   3   1   5
1   1   3   5
2   2   2   5
3   4   4   9
4   5   0   6
5   3   0   4
6   4   1   6
7   10  0   7
最后,按总排名对数据帧进行排序

df.sort(columns='total_rank' , ascending = False)


Out[49]:
    A   B   total_rank
3   4   4   9
7   10  0   7
4   5   0   6
6   4   1   6
0   3   1   5
1   1   3   5
2   2   2   5
5   3   0   4

为什么
[4,4]
是最佳选择?因为对于两个列的组合,它具有最大值。例如,最后一行在A列中有10个,但在B列中有0个。对于B列,还有其他更高的值。你可以说我在寻找两列的组合平均最大值。希望这能澄清什么是正确的总顺序?值是随机数,因为我不知道如何计算,所以我没有正确的总顺序。谢谢你的提示。我在@dermen的回答下面留下了我的排名方法,实际上它并没有复制相同的顺序。我觉得很好。在收到@padraic cunningham的“rank”提示后,我想出了
df[“best_choice”]=df[“A”,“B”].rank().sum(axis=1)
df.sort(“best_choice”,升序=False)
,但它在[4,4]时以不同的顺序产生仍然似乎是最好的选择。我不确定
DataFrame.rank
如何在多个列上工作,我无法使用任何其他方法重现该结果。。。在我看来,“A”有11个值,“B”有5个值。因此(A=4,B=4)对应于A的秩5/11和B的秩5/5,两者相加产生的总秩为1.45(最大总秩)。接下来我们考虑(A=10,B=0),对应于A和1/5的秩11/11。加上两个收益率1.2,净最高值等。AM I正确地添加个人排名,还是总排名更复杂?谢谢!从我的角度来看,顺序似乎是正确的。不过我喜欢@dermen的方法。如果A类与B类相比重量更大,我将如何修改此项?仅A*2(例如A的权重是B的两倍)?您可以正常计算A组的排名,然后乘以权重
df['total_rank'] = rank.sum(axis = 1)
df


Out[46]:
    A   B   total_rank
0   3   1   5
1   1   3   5
2   2   2   5
3   4   4   9
4   5   0   6
5   3   0   4
6   4   1   6
7   10  0   7
df.sort(columns='total_rank' , ascending = False)


Out[49]:
    A   B   total_rank
3   4   4   9
7   10  0   7
4   5   0   6
6   4   1   6
0   3   1   5
1   1   3   5
2   2   2   5
5   3   0   4