首页 > 解决方案 > 根据用户输入,获取另一列的排名值

问题描述

我有一个数据框如下:

Card    Nation  Age     Category    Amount
A       India   Young   House       225
A       India   Young   Electrical  125
B       India   Young   House       250
B       India   Young   Electrical  160
B       India   Young   Bike        110
C       India   Young   Electrical  220
C       India   Young   Bike        200
C       India   Young   House       210

现在,我得到如下用户输入:

Nation  Age     Category    Amount
India   Young   Electrical  145
India   Young   Bike        125
India   Young   House       225

现在,我需要在数据框中查找并相应地对卡片进行排名。在这种情况下,排名卡

output will be 
B, C, A

基本上,我们需要将 use 输入的所有元素与 dataframe 中的所有元素进行比较,并输出最匹配的 Card 值的排名顺序。

在我们的例子中,因为Card "A" has no Category "Bike" it comes last in our Rank. 其他卡具有所有给定的类别,因此我们比较金额.. 最接近的卡在排名中排在第一位。

有什么帮助吗?

标签: pythonpandas

解决方案


采用 -

temp = inp.merge(df,how='left',on=['Nation', 'Age', 'Category'])
temp['diff'] = (temp['Amount_x'] - temp['Amount_y']).abs()
temp = temp.sort_values(by=['diff'])

def get_cards(x):
    extra = {'A','B','C'}.difference(set(x))
    x=x.append(pd.Series(list(extra)))
    return ",".join(x.tolist())
temp.groupby(['Nation','Age','Category'])['Card'].apply(lambda x: get_cards(x) )

输出

Nation  Age    Category  
India   Young  Bike          B,C,A
               Electrical    B,A,C
               House         A,C,B
Name: Card, dtype: object

推荐阅读