python - 根据另一个列表类型列对熊猫列表类型列值进行排序
问题描述
我有一个这样的数据框,
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 快捷方式来更有效地执行此操作。
解决方案
一个想法是使用带有列表推导的 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]