#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