Сортировка столбца фрейма данных с заданным списком входных данных

#python #pandas #sorting #dataframe

#python #панды #сортировка #фрейм данных

Вопрос:

Привет, я хочу отсортировать столбец фрейма данных с заданными значениями списка ввода. Мой список выглядит так :

 inputlist
[309.0, 585.0, 221.0, 789.0, 195.0, 354.0, 307.0, 698.0, 426.0]
 

И фрейм данных :

   val    kaywords

195    keyword3
221    keyword5
307    keyword8
309    keyword9
354    keyword0
426    keyword1
585    keyword2
698    keyword4
789    keyword33
 

Здесь я хочу отсортировать столбец фрейма данных ‘val’ на основе заданного ‘inputlist’.

Я ожидаю следующего вывода :

 val    kaywords

309    keyword9
585    keyword2
221    keyword5
789    keyword33
195    keyword3
354    keyword0
307    keyword8
698    keyword4
426    keyword1
 

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

1. @jezrael спасибо за быстрый повтор. Я обновил свой вопрос ожидаемым результатом.

Ответ №1:

Используйте упорядоченный categorical , но сначала преобразуйте значения списка в целые числа:

 inputlist = [309.0, 585.0, 221.0, 789.0, 195.0, 354.0, 307.0, 698.0, 426.0]

df['val'] = pd.Categorical(df['val'], ordered=True, categories=[int(x) for x in inputlist])
df = df.sort_values('val')
print (df)
   val   kaywords
3  309   keyword9
6  585   keyword2
1  221   keyword5
8  789  keyword33
0  195   keyword3
4  354   keyword0
2  307   keyword8
7  698   keyword4
5  426   keyword1
 

Другая идея, если все значения из val существуют в inputlist :

 inputlist = [int(x) for x in inputlist]
df = df.set_index('val').reindex(inputlist).reset_index()
 

Ответ №2:

 input_list = [309.0, 585.0, 221.0, 789.0, 195.0, 354.0, 307.0, 698.0, 426.0]

index = {int(j):i for i,j in enumerate(input_list)}

df = pd.DataFrame({"val":[195, 221, 307, 309, 354, 426, 585, 698, 789]})

df["sort"] = df.apply(lambda row: index[row.val], axis=1)


df = df.sort_values(by=['sort'])

df = df.drop("sort", axis=1)
 

Ответ №3:

Возможно, самый краткий способ — определить val как ваш индекс, а затем вызвать его в порядке inputlist :

df.set_index('val').loc[inputlist, :]

Ответ №4:

Возможно, вы можете создать новый фрейм данных

 inputlist=[309.0, 585.0, 221.0, 789.0, 195.0, 354.0, 307.0, 698.0, 426.0]

df = pd.DataFrame({"val" :[195.0, 221, 307.0,309.0,354.0,426.0,585.0,698.0,789.0],
                   "keywords" :["keywords3","keywords5","keywords8","keywords9","keywords0","keywords1","keywords2","keywords4","keywords33"]
})

df2=pd.DataFrame()
for i in inputlist:
    df2 = df2.append(df[df["val"]==i])

print(df2)


     val    keywords
3  309.0   keywords9
6  585.0   keywords2
1  221.0   keywords5
8  789.0  keywords33
0  195.0   keywords3
4  354.0   keywords0
2  307.0   keywords8
7  698.0   keywords4
5  426.0   keywords1