我有两个pandas数据帧:
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')
但我无法弄清楚如何在“每个人”的数据框中获得他们的序数位置。理想情况下,该解决方案会向朋友数据框添加一个查找列,如下所示。爱丽丝是每个人的第五个入口;吉姆是第三名;爱德华0号。订单(符合我原来朋友的订单)显然很关键。
name everyone_id
0 Alice 5
1 Jim 3
2 Edward 0
我可能会写一个慢查找函数和friends.apply()它,但是假设pandas有一个我找不到的更简单的函数或参数。
答案 0 :(得分:1)
您可以将map
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
的{{3}}类似解决方案:
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