питонический способ ранжирования и последующего объединения дублированных строк во фрейме данных

#python #pandas #numpy #dataframe #group-by

#python #pandas #numpy #фрейм данных #группировка по

Вопрос:

У меня есть большой фрейм данных в следующем формате :

 name       ingredient       colour      similarity      ids      city      country     proba
pesto      ba               g           0.93            4        ve        it          0.85
pesto      sa               p           0.93            3        to        ca          0.92
pesto      li               y           0.99            6        lo        en          0.81
pasta      fl               w           0.88            2        de        in          0.8
pasta      wa               b           0.93            1        da        te          0.84
egg        eg               w           1               5        ro        ja          0.99
  

Я хочу ранжировать все name по их similarity (более высокое сходство будет иметь более высокий ранг, и если 2 строки имеют одинаковое сходство, то порядок, в котором они добавляются, не имеет значения), а затем объединить все дублированные строки вместе

результат будет выглядеть следующим образом:

 name   ingredient          colour           similarity         ids        city               country            proba
pesto  ['li', 'ba', 'sa']  ['y', 'g', 'p']  [0.99, 0.93, 0.93] [6, 4, 3]  ['lo', 've', 'to'] ['en', 'it', 'ca'] [0.81, 0.85, 0.92]
pasta  ['wa', 'fl']        ['b', 'w']       [0.93, 0.88]       [1, 2]     ['da', 'de']       ['te', 'in']       [0.84, 0.8]
egg    ['eg']              ['w']            [1]                [5]        ['ro']             ['ja']             [0.99]
  

Комментарии:

1. упс, я пропустил a и o в итоге, извините

Ответ №1:

Сначала преобразуйте name в упорядоченный категориальный для исходного упорядочения, если важен порядок name , затем сортируйте по обоим столбцам по DataFrame.sort_values и последнему агрегату list -х:

 df['name'] = pd.Categorical(df['name'], ordered=True, categories=df['name'].unique())

df1=df.sort_values(['name','similarity'], ascending=[True, False]).groupby('name').agg(list)

print (df1)
         ingredient     colour          similarity        ids          city  
name                                                                          
pesto  [li, ba, sa]  [y, g, p]  [0.99, 0.93, 0.93]  [6, 4, 3]  [lo, ve, to]   
pasta      [wa, fl]     [b, w]        [0.93, 0.88]     [1, 2]      [da, de]   
egg            [eg]        [w]               [1.0]        [5]          [ro]   

            country               proba  
name                                     
pesto  [en, it, ca]  [0.81, 0.85, 0.92]  
pasta      [te, in]         [0.84, 0.8]  
egg            [ja]              [0.99]  
  

Другая идея заключается в сортировке по группам:

 df1 = (df.groupby('name', group_keys=False, sort=False)
         .apply(lambda x: x.sort_values('similarity', ascending=False))
         .groupby('name', sort=False).agg(list))
  

Если возможен порядок name сортировки, например, по убыванию:

 df2 = (df.sort_values(['name','similarity'], ascending=False)
         .groupby('name', sort=False)
         .agg(list))

print (df2)
         ingredient     colour          similarity        ids          city  
name                                                                          
pesto  [li, ba, sa]  [y, g, p]  [0.99, 0.93, 0.93]  [6, 4, 3]  [lo, ve, to]   
pasta      [wa, fl]     [b, w]        [0.93, 0.88]     [1, 2]      [da, de]   
egg            [eg]        [w]               [1.0]        [5]          [ro]   

            country               proba  
name                                     
pesto  [en, it, ca]  [0.81, 0.85, 0.92]  
pasta      [te, in]         [0.84, 0.8]  
egg            [ja]              [0.99]  
  

Комментарии:

1. Я также думал о том же направлении сортировки name и similarity , pd.Categorical это хороший способ!