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