map和apply都是用于映射的,map一般用于Series对象,而apply用于DataFrame对象。
简答的讲:
所以很多观点认为apply比map更好用。
实际上map也有独特之处:
上代码对比:
"""用map实现字典映射""" df = pd.DataFrame({"姓名":["大宝","二狗","三炮","四眼","五福"],"工龄":[3,5,2,1,None],"奖金":[200,300,100,100,None]}) change = {"大宝":"张三", "二狗":"李四", "三炮":"王五", "四眼":"赵六", "五福":"宋七"} df["姓名"] = df["姓名"].map(change) # 注意:用map做字典映射的时候,字典的键必须包含Series所有的非重复值,否则没在字典键没有描述到的值也会被默认修改成最后一个键的值 def fun(x): return x + 1 df["工龄"] = df["工龄"].map(fun) # 不论map还是apply,都是只传函数名不加括号调用
"""apply可以映射多个参数的函数""" def func(x,num): return x + x * num def foo(x,y): if x >= 3: return x * y else: return x * y / 2 df["次月奖金"] = df["奖金"].apply(func,args=(0.1,),axis=1) #args用于接收额外的参数,以元组类型传递。axis默认等于0 df["年终奖"] = df.apply(lambda df: foo(x=df["工龄"],y=df["奖金"]),axis=1) # 个人推荐用法 df[["奖金","次月奖金","年终奖"]].apply(sum,axis=0) #对每列求和
df.loc[df["工龄"]<2,"年终奖"] = 500 # 其本质是根据特定条件找到符合条件的索引重新赋值 # 注意使用上述用法的前提是DataFrame的索引必须是连续不间断的。若索引不连续,可以先用reset_index()将索引转换成列,这样就会默认生成新的索引
df.fillna({"工龄":1,"奖金":df["工龄"]*100},inplace=True)
以上为个人经验,希望对您有所帮助。