将列表列表中的每个元素与数据框中的列进行比较 python

Compare each element in list of lists with a column in a dataframe python

我想将列表列表中的每个元素与数据框列进行比较。 例如,

groups_rids=[['AX1','AX2'],['AX6','AX5','AX17']]
df = pd.DataFrame({'rid': ['AX1','AX2','AX6','AX5','AX17'],
                   'pid': ['P2','P0','P3','P9','P13'],
                   })

这里group_rids是列表列表。必须和df中的rid比较。

数据集:

rid pid
AX1 P2
AX2 P0
AX6 P3
AX5 P9
AX17 P13

我的结果应该是:

groups_rids pid
[AX1,AX2] [P2,P0]
[AX6,AX5,AX17] [P3,P9,P13]

对于 groups_rids 中的每个列表,我想搜索 df,如果存在,追加相应的 pid 数据集很大。所以 3 个嵌套的 for 循环永远打印结果。有没有办法在没有 3 个嵌套 for 循环的情况下获得所需的结果?

构建字典:

d = df.set_index('rid').to_dict()['pid']

并用它来构建 Dataframe:

pd.DataFrame(((x, [d[el] for el in x]) for x in groups_rids), columns=['groups_rid', 'pid'])
         groups_rid            pid
0        [AX1, AX2]       [P2, P0]
1  [AX6, AX5, AX17]  [P3, P9, P13]

您可以从 groups_rids

的列表索引创建组 ID
ids = {v:i for i, lst in enumerate(groups_rids) for v in lst}

out = df.groupby(df['rid'].map(ids)).agg(list).reset_index(drop=True)
print(out)

                rid            pid
0        [AX1, AX2]       [P2, P0]
1  [AX6, AX5, AX17]  [P3, P9, P13]