Python pandas сортировка буквенно-цифровая - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь отсортировать текстовый файл в python, содержащий некоторую информацию о фильмах (взято из https://datasets.imdbws.com/). Вот мой маленький пример, над которым я работал:

titleId ordering    title   region  language    types   attributes  isOriginalTitle
tt1037178   1   Women's Studies US  \N  \N  \N  0
tt10371782  1   Episodio #1.67  IT  it  \N  \N  0
tt10371782  2   एपिसोड #1.67    IN  hi  \N  \N  0
tt10371782  3   エピソード #1.67 JP  ja  \N  \N  0
tt10371790  4   एपिसोड #1.70    IN  hi  \N  \N  0
tt10371790  5   エピソード #1.70 JP  ja  \N  \N  0
tt10371790  6   Épisode #1.70   FR  fr  \N  \N  0
tt10371790  7   Folge #1.70 DE  de  \N  \N  0
tt1037179   1   Wood Simps  US  \N  \N  \N  0

Я использую следующий код для сортировки:

import pandas
df = pandas.read_csv('title.akas_test_input.txt', sep='\t', low_memory=False)
a=df.sort_values("titleId", ascending=True)
a.to_csv("title.akas_test_output.txt", sep='\t', index=None)

и вывод:

titleId ordering    title   region  language    types   attributes  isOriginalTitle
tt1037178   1   Women's Studies US  \N  \N  \N  0
tt10371782  1   Episodio #1.67  IT  it  \N  \N  0
tt10371782  2   एपिसोड #1.67    IN  hi  \N  \N  0
tt10371782  3   エピソード #1.67 JP  ja  \N  \N  0
tt1037179   1   Wood Simps  US  \N  \N  \N  0
tt10371790  4   एपिसोड #1.70    IN  hi  \N  \N  0
tt10371790  5   エピソード #1.70 JP  ja  \N  \N  0
tt10371790  6   Épisode #1.70   FR  fr  \N  \N  0
tt10371790  7   Folge #1.70 DE  de  \N  \N  0

пока мой ожидаемый результат будет таким:

titleId ordering    title   region  language    types   attributes  isOriginalTitle
tt1037178   1   Women's Studies US  \N  \N  \N  0
tt1037179   1   Wood Simps  US  \N  \N  \N  0
tt10371782  1   Episodio #1.67  IT  it  \N  \N  0
tt10371782  2   एपिसोड #1.67    IN  hi  \N  \N  0
tt10371782  3   エピソード #1.67 JP  ja  \N  \N  0
tt10371790  4   एपिसोड #1.70    IN  hi  \N  \N  0
tt10371790  5   エピソード #1.70 JP  ja  \N  \N  0
tt10371790  6   Épisode #1.70   FR  fr  \N  \N  0
tt10371790  7   Folge #1.70 DE  de  \N  \N  0

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 21 марта 2020

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

df['titleId_number']=df['titleId'].apply(lambda x: int(x.split('tt')[1]))
df.sort_values('titleId_number')
0 голосов
/ 21 марта 2020
df['titleId_number']=df['titleId'].str.split('tt')[1].astype(int)

Функция лямбда не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...