根据另一个列表类型列对熊猫列表类型列值进行排序

时间:2021-02-23 06:52:39

标签: python pandas dataframe

我有一个这样的数据框,

df 
col1        col2                 col3
A       ['p', 'q', 'r']          ['x', 'r', 'p']
B       ['x', 'y']               ['y']
C       ['t', 'u', 'p']          ['u', 'p', 'x', 't']
D       ['a', 'b']               ['x', 'y']

现在我想根据 col3 序列对 col2 的值(列表)进行排序,以便最终的数据帧看起来像,

 df
 
 col1        col2                 col3
 A       ['r','p', 'q']           ['x', 'r', 'p']
 B       ['y', 'x']               ['y']
 C       ['u', 'p','t']           ['u', 'p', 'x', 't']
 D       ['a', 'b']               ['x', 'y']

我可以使用 for 循环并比较两个列表来执行此操作,但执行需要更多时间,需要寻找一些 Pandas 快捷方式以更有效地执行此操作。

1 个答案:

答案 0 :(得分:3)

一个想法是使用带有列表推导式的 cutom 函数来测试成员资格:

def f(x):
    a = x['col2']
    b = x['col3']
    yes = [x for x in b if x in a]
    no =  [x for x in a if x not in out]

    return yes + no
    
    

df['col2'] = df.apply(f, axis=1)
print (df)
  col1       col2          col3
0    A  [r, p, q]     [x, r, p]
1    B     [y, x]           [y]
2    C  [u, p, t]  [u, p, x, t]
3    D     [a, b]        [x, y]

熊猫解决方案:

df['col2'] = (df['col3'].explode().reset_index()
                        .merge(df['col2'].explode().reset_index(), 
                               left_on=['index','col3'],
                               right_on=['index','col2'],
                               how='outer')
                       .dropna(subset=['col2'])
                       .groupby('index')['col2']
                       .agg(list))
print (df)
  col1       col2          col3
0    A  [r, p, q]     [x, r, p]
1    B     [y, x]           [y]
2    C  [u, p, t]  [u, p, x, t]
3    D     [a, b]        [x, y]