如何从列表类别中对pandas数据框进行排序?

时间:2015-03-30 13:06:42

标签: python sorting pandas

所以我在下面有这个数据集,我希望根据列' name'中的mylist进行排序。以及由A' A'然后由' B'降序

import pandas as pd
import numpy as np

    df1 = pd.DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6]) , ('name', ['x','x','x'])])
    df2 = pd.DataFrame.from_items([('B', [5, 6, 7]), ('A', [8, 9, 10]) , ('name', ['y','y','y'])])
    df3 = pd.DataFrame.from_items([('C', [5, 6, 7]), ('D', [8, 9, 10]), ('A',[1,2,3]), ('B',[4,5,7] ), ('name', ['z','z','z'])])
    df_list = [df1,df2,df3[['A','B','name']]]
    df = pd.concat(df_list, ignore_index=True)

所以我的清单是

  mylist = ['z','x','y']

我希望数据集以我的列表排序开始,然后排序asc列A然后排序列B

有没有办法在python中执行此操作?

enter image description here

========编辑========== 我希望我的最终结果类似于

enter image description here

2 个答案:

答案 0 :(得分:2)

好的,按自定义顺序排序的方法是创建一个dict,用于定义'name'列的顺序,调用map添加定义此新订单的新列,然后调用{{ 3}}并传入新列和其他列,以及param ascending,您可以选择性地决定每列是否按升序排序,然后最后删除该列:

In [20]:

name_sort = {'z':0,'x':1,'y':2}
df['name_sort'] = df.name.map(name_sort)
df
Out[20]:
    A  B name  name_sort
0   1  4    x          1
1   2  5    x          1
2   3  6    x          1
3   8  5    y          2
4   9  6    y          2
5  10  7    y          2
6   1  4    z          0
7   2  5    z          0
8   3  7    z          0
In [23]:

df = df.sort(['name_sort','A','B'], ascending=[1,1,0])
df
Out[23]:
    A  B name  name_sort
6   1  4    z          0
7   2  5    z          0
8   3  7    z          0
0   1  4    x          1
1   2  5    x          1
2   3  6    x          1
3   8  5    y          2
4   9  6    y          2
5  10  7    y          2
In [25]:

df = df.drop('name_sort', axis=1)
df
Out[25]:
    A  B name
6   1  4    z
7   2  5    z
8   3  7    z
0   1  4    x
1   2  5    x
2   3  6    x
3   8  5    y
4   9  6    y
5  10  7    y

答案 1 :(得分:1)

您好,我们可以通过使用上述问题来解决上述问题。

t = pd.CategoricalDtype(categories=['z', 'x','y'], ordered=True) df['sort']=pd.Series(df.name, dtype=t) df.sort_values(by=['sort','A','B'],inplace=True)