将列表列表中的每个元素与数据框中的列进行比较 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]
我想将列表列表中的每个元素与数据框列进行比较。 例如,
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
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]