我的数据框如下:
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
起。
其他卡片具有所有给定的类别,因此我们比较金额..匹配最接近的卡片在排名中排在首位。
有帮助吗?
答案 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']