根据用户输入,获取另一列的等级值

时间:2019-01-03 08:04:58

标签: python pandas

我的数据框如下:

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

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

output will be 
B, C, A

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

在我们的情况下,自Card "A" has no Category "Bike" it comes last in our Rank起。 其他卡片具有所有给定的类别,因此我们比较金额..匹配最接近的卡片在排名中排在首位。

有帮助吗?

2 个答案:

答案 0 :(得分:0)

使用-

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

答案 1 :(得分:0)

IIUC,这是解决方案-

df = pd.read_csv('SO.csv', sep=' ')
user = pd.read_csv('out.csv', sep=' ')
uni = user.Category.unique()
amt = user.Amount.sum()
df_cat = df.groupby('Card')['Category'].unique()
df_sum = df.groupby('Card')['Amount'].sum()
idx_ = pd.concat([
            pd.DataFrame([3 - len(set(uni) & set(df_cat[i])) for i in range(3)], index=list('ABC'), columns=['Cat_rank']).rank(method='dense'),
            pd.DataFrame([abs(amt-df_sum[i]) for i in range(3)], index=list('ABC'), columns=['Amt_rank']).rank(method='dense')], axis=1).sum(axis=1).rank().astype(int)
idx_.reset_index().sort_values([0]).loc[:,'index'].values

# Output -> ['B', 'C', 'A']