如果值与另一个数据帧相交,如何从pandas.DataFrame中提取索引?

2022-08-10 12:41:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧:

import pandas as pd

friends = pd.dataframe({
    'name' : ['Alice', 'Jim', 'Edward'],
})

everyone = pd.dataframe({
    'name' : ['Edward', 'Conrad', 'Lucy', 'Jim', 'Frank', 'Alice', 'Sam']
})

我可以得到我朋友的名单,按“每个人”的顺序,有索引

everyone.loc[everyone['name'].isin(friends['name'])]

我可以在“每个人”中找到我朋友的布尔掩码

everyone['name'].isin(friends['name'])

我甚至以为我找到了一个笨拙的解决方案,但它也重新安排了事情

everyone.reset_index().merge(friends, how='right', on='name').set_index('index')

但我不知道如何在“每个人”数据框中获得它们的序号。理想情况下,该解决方案会向friends数据框添加一个查找列,如下所示。爱丽丝是每个人的第五名;吉姆是第三个;第0个爱德华。顺序(匹配我原来朋友的顺序)显然很关键

  name   everyone_id
0 Alice   5
1 Jim     3
2 Edward  0

我可能会编写一个缓慢的查找函数和friends.apply(),但假设pandas有一个我找不到的更简单的函数或参数


Tags: 数据namedataframepandasindex顺序朋友解决方案pdedwardalicefriendseveryonejimisin
1条回答
网友
1楼 ·

可以使用^{}with交换的索引值:

d = everyone['name'].to_dict()
d = {v:k for k, v in d.items()}

friends['everyone_id'] = friends['name'].map(d)
print (friends)
     name  everyone_id
0   Alice            5
1     Jim            3
2  Edward            0

类似的解决方案是^{}Series

s = pd.Series(everyone['name'].index, index=everyone['name'].values)
friends['everyone_id'] = friends['name'].map(s)
print (friends)

     name  everyone_id
0   Alice            5
1     Jim            3
2  Edward            0