Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在数据框中对字符串列进行排序,在数据框中强制对该列按字母顺序排序?_Python_Pandas - Fatal编程技术网

Python 如何在数据框中对字符串列进行排序,在数据框中强制对该列按字母顺序排序?

Python 如何在数据框中对字符串列进行排序,在数据框中强制对该列按字母顺序排序?,python,pandas,Python,Pandas,我有一个python中的数据框架,其中一列包含以下字母D W M Y,代表日、周、月、年。我想根据这个列按照我给出的顺序对我的数据帧进行排序。然而,我能找到的唯一选择是根据字母顺序排序,这不是我需要的。你能告诉我这是否可行吗 下面的数据框是我试图排序的一个示例。我需要它首先根据id排序,然后是单位,单位是D,W,M,Y,然后是时间。我尝试使用常规排序功能,但它不起作用,因为它是根据字母顺序对单元进行排序 数据帧 id time unit 1 3 M 2 5

我有一个python中的数据框架,其中一列包含以下字母D W M Y,代表日、周、月、年。我想根据这个列按照我给出的顺序对我的数据帧进行排序。然而,我能找到的唯一选择是根据字母顺序排序,这不是我需要的。你能告诉我这是否可行吗

下面的数据框是我试图排序的一个示例。我需要它首先根据id排序,然后是单位,单位是D,W,M,Y,然后是时间。我尝试使用常规排序功能,但它不起作用,因为它是根据字母顺序对单元进行排序

数据帧

id  time  unit     
1   3     M
2   5     Y
1   12    D
8   6     W
6   1     M
1   2     W

dataframe.sort_values(by=[id,unit,time])

您可以将
单元
列定义为,然后对列进行排序

通过这样做,可以根据类别的自定义顺序对有序类别进行排序,并且可以具有最小值和最大值。这可以通过设置一个
类别
列表来完成,该列表将指定对数据帧进行排序时要遵循的顺序。然后,您可以简单地对数据帧进行排序,就像您使用
排序\u值所做的那样:

df['unit'] = pd.Categorical(df.unit.tolist(), categories=list('DWMY'))
df.sort_values(['id','unit','time'])


或者,您可以在数据框中创建一个单独的列:

df['unit_index'] = df['unit'].apply(list('DWMY').index)
df.sort_values(['id','unit_index','time'])

   id  time unit  unit_index
2   1    12    D           0
5   1     2    W           1
0   1     3    M           2
1   2     5    Y           3
4   6     1    M           2
3   8     6    W           1
df['unit_index'] = df['unit'].apply(list('DWMY').index)
df.sort_values(['id','unit_index','time'])

   id  time unit  unit_index
2   1    12    D           0
5   1     2    W           1
0   1     3    M           2
1   2     5    Y           3
4   6     1    M           2
3   8     6    W           1