我有两个数据框:
df1 = c1, c2, c3
1, 2, [1,2,3,4]
8, 9, [10,11]
df2 = c4, c5, c6
3, 4, [1,2]
5, 6 [2,3]
我想通过数组交集(c1 intresect c6)连接 df1 和 df2,然后分组 c1 和 c2,其中 r1 包含 df2 的数据帧行列表
result = c1, c2, r1,
1 2, [row(3,4), row(5,6)]
我如何有效地实现这一目标
我尝试过使用合并、分组
explode
、merge
,只保留与 drop_duplicates
的重叠,然后 agg
+groupby.agg
:
out = (df1.explode('c3')
.merge(df2.explode('c6').reset_index(), left_on='c3', right_on='c6')
.drop_duplicates(['c1', 'c2', 'index'])
.set_index(['c1', 'c2'])[['c4', 'c5']].agg(list).agg(list, axis=1)
.groupby(['c1', 'c2']).agg(list)
.reset_index(name='r1')
)
输出:
c1 c2 r1
0 1 2 [[3, 4], [5, 6]]
可重复输入:
df1 = pd.DataFrame({'c1': [1,8], 'c2': [2,9], 'c3': [[1,2,3,4],[10,11]]})
df2 = pd.DataFrame({'c4': [3,5], 'c5': [4,6], 'c6': [[1,2],[2,3]]})