如何为pandas的friends DataFrame添加everyone中对应名称的索引列?
解决方法:用Series映射快速匹配索引
刚好有个非常简洁高效的pandas方法能满足你的需求,完全不用写慢的apply或者担心顺序被打乱!
首先先纠正下你代码里的小拼写错误:pd.dataframe要改成大写的pd.DataFrame,不然运行会报错哦。
核心思路
我们可以先创建一个名字到everyone索引的映射关系,然后直接用这个映射给friends添加新列,全程是向量化操作,速度快还能完美保留friends的原顺序。
完整代码示例
import pandas as pd # 纠正拼写错误后的DataFrame创建 friends = pd.DataFrame({ 'name' : ['Alice', 'Jim', 'Edward'], }) everyone = pd.DataFrame({ 'name' : ['Edward', 'Conrad', 'Lucy', 'Jim', 'Frank', 'Alice', 'Sam'] }) # 1. 创建名字到everyone索引的映射Series name_to_everyone_idx = pd.Series(everyone.index, index=everyone['name']) # 2. 用map方法给friends添加everyone_id列 friends['everyone_id'] = friends['name'].map(name_to_everyone_idx) print(friends)
运行后输出的结果完全符合你的预期:
name everyone_id 0 Alice 5 1 Jim 3 2 Edward 0
为什么这个方法更好?
- 保留原顺序:不像你之前尝试的
merge方法会打乱friends的原有排序,map会严格按照friends中name的顺序去匹配对应的索引。 - 高效快速:这是pandas的向量化操作,比循环或者
apply这种逐行处理的方法效率高得多,数据量大的时候差距会很明显。 - 代码简洁:两行核心代码就搞定,逻辑清晰易懂。
如果你担心有名字不在everyone里的情况,可以给map加个na_action='ignore'参数,或者用fillna来处理缺失值,比如:
friends['everyone_id'] = friends['name'].map(name_to_everyone_idx).fillna(-1).astype(int)
这样不存在的名字会被标记为-1,避免出现NaN。
内容的提问来源于stack exchange,提问作者mightypile
相关产品推荐
相关产品推荐

