首页 > 解决方案 > 使用列表中的特定顺序按列排序数据帧

问题描述

是否可以按具有特定顺序的列排序/运行数据框,比如我有

col1 col2
v_1  4
v_2  3
v_3  1 

并说您要订购为:

col1 col2
v_3  1
v_1  4
v_2  3

因为我想在 col1 列中按 [3,1,2] 排序。简化示例,因为我的 df 有 42 行。我期望能够传递一个值列表 [3,1,2] 并根据这些指标对 col1 进行排序,因此 1 指的是 v_1 等

标签: pythonpandas

解决方案


一种方法是创建一个临时列order并从该列中获取列表项的索引col1,然后在此临时列上对数据框进行排序,并在返回数据框之前删除该列。

像这样的东西:

def sortDF(df, lst, colName='col1'):
    df['order'] = df[colName].apply(lambda x: lst.index(x))
    return df.sort_values(['order']).drop(columns=['order'])

样品输出:

>>> df
   col1  col2
0     1     4
1     2     3
2     3     1

>>> sortDF(df, [3,1,2], 'col1')
   col1  col2
2     3     1
0     1     4
1     2     3

PS:上面的方法期望col1列表中的所有值也存在,否则会抛出IndexError,如果不是这种情况,您可以手动处理该情况,并通过列表示NaN,然后您可以在对数据帧进行排序order时使用参数na_position.


推荐阅读