所以我在下面有这个数据集,我希望根据列' 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中执行此操作?
========编辑========== 我希望我的最终结果类似于
答案 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)