#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
это хороший способ!