Сортировать столбец DataFrame с заданным списком ввода - PullRequest
2 голосов
/ 14 апреля 2019

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

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

И DataFrame:

  val    kaywords

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

Здесь я хочу отсортировать столбец DataFrame 'val' на основе заданного 'inputlist'.

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

val    kaywords

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

Ответы [ 4 ]

4 голосов
/ 14 апреля 2019

Используйте упорядоченный 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()
0 голосов
/ 14 апреля 2019

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

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
0 голосов
/ 14 апреля 2019

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

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

0 голосов
/ 14 апреля 2019
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...