Python熊猫对字母数字进行排序

时间:2020-03-20 22:11:38

标签: python pandas sorting

我正在尝试使用python对txt文件进行排序,其中包含有关电影的一些信息(摘自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 个答案:

答案 0 :(得分:2)

问题是您的列具有字符串类型。对该类型的列进行排序将返回Lexicographical order。为了您的目的,我将首先提取带有数字的部分,然后再对其进行排序。例如:

df['titleId_number']=df['titleId'].apply(lambda x: int(x.split('tt')[1]))
df.sort_values('titleId_number')

答案 1 :(得分:0)

df['titleId_number']=df['titleId'].str.split('tt')[1].astype(int)

不需要lambda函数。