首页 > 解决方案 > 根据Python中另一个数据框的列对一个数据框的行(有重复的列)进行排序

问题描述

我有两个数据框df1df2. 我想按列 dataframe的顺序df1基于列SETSET列重复但其他列不重复)进行排序。SETfdf2

df1:-

SET    Date      cust_ID  TYPE  amt     total flag LEVEL
A   6/10/2019   113252981   R   1317    16237   Y    3
C   6/18/2019   112010871   R   4582    12455   Y    2
B   6/22/2019   204671333   S   2364    24311   Y    1
B   6/22/2019   202770598   S   4721    10582   Y    1
B   6/22/2019   202706466   S   1904    25343   N    2
B   6/22/2019   202669668   S   3713    25166   N    1
B   6/22/2019   202754932   T   4792    16888   Y    2
D   6/7/2019    120304631   P   4968    25297   Y    2
D   6/7/2019    112353651   P   1622    14384   Y    3
D   6/7/2019    112349221   P   4721    15878   Y    3
D   6/8/2019    111197161   P   4490    25489   N    2
E   6/8/2019    137049981   Q   4409    10842   Y    2
A   6/8/2019    137281821   Q   1060    24085   Y    2
C   6/8/2019    136390501   Q   1649    13626   N    2
C   6/9/2019    136326431   Q   3822    13599   N    2

df2:-

  s_no  SETf
    1   B
    2   D
    3   C
    4   A
    5   E

我想df1根据 的相同顺序对SETf的行进行排序df2

我尝试了什么:-

df1 =df1.set_index('SET')

df1= df1.reindex(df2.index['SETf'])

df1= df1.reset_index()

它不起作用,因为我在SET中有重复项df1。除了这样做之外,我还想根据LEVEL ascending每个SETflag

标签: python-3.xpandasdataframe

解决方案


在您的第二个数据框中,如果您的s_no列是唯一的并且升序 [1、2、3、4 等],则创建,然后合并两个数据框并按s_no您合并的列排序,然后将其删除:


df1 = pd.merge(df1, df2[['SETf', 's_no']].rename({'SETf':'SET'}, axis=1), how='left',on='SET')
df1 = df1.sort_values(['s_no', 'flag', 'LEVEL']).drop('s_no', axis=1)
df1
Out[490]: 
   SET       Date    cust_ID TYPE   amt  total flag  LEVEL
5    B  6/22/2019  202669668    S  3713  25166    N      1
4    B  6/22/2019  202706466    S  1904  25343    N      2
2    B  6/22/2019  204671333    S  2364  24311    Y      1
3    B  6/22/2019  202770598    S  4721  10582    Y      1
6    B  6/22/2019  202754932    T  4792  16888    Y      2
10   D   6/8/2019  111197161    P  4490  25489    N      2
7    D   6/7/2019  120304631    P  4968  25297    Y      2
8    D   6/7/2019  112353651    P  1622  14384    Y      3
9    D   6/7/2019  112349221    P  4721  15878    Y      3
13   C   6/8/2019  136390501    Q  1649  13626    N      2
14   C   6/9/2019  136326431    Q  3822  13599    N      2
1    C  6/18/2019  112010871    R  4582  12455    Y      2
12   A   6/8/2019  137281821    Q  1060  24085    Y      2
0    A  6/10/2019  113252981    R  1317  16237    Y      3
11   E   6/8/2019  137049981    Q  4409  10842    Y      2

推荐阅读