记录一次 panads中apply函数 与lambda 匿名函数

背景

这边想要计算 df2中各个销售人员的销售额,而销售额来自于 df1中,有点类似于 excel中的sumifs。
1.一般思路是对两张表进行merge,然后进行groupby,但是比较麻烦。
2. 对于df2销售人员的销售额来说无非是 取相同地区 及人员的 销售额 然后进行聚合即可。涉及到筛选,以及聚合操作

import panads as pd
df1 = pd.DataFrame({'销售人员':['张三','李四','张三','张三','王五','李四'],'地区':['湖北','北京','上海','湖北','北京','北京'],'销售额':[100,200,100,300,100,2000]})
df2 = pd.DataFrame({'销售人员':['张三','kaisi','王五','李四','iii'],'地区':['湖北','上海','上海','北京','广东']})

# 以下apply应用主体是 df2[['销售人员','地区']] 并且设定其中一个参数axis=1 是按行来进行操作,所以每次匿名函数lambda中 x 代表 df2[['销售人员','地区']][0,:]
df2['销售额'] = df2[['销售人员','地区']].apply(lambda x : df1.loc[(df1.销售人员== x['销售人员'])&(df1.地区==x['地区']),'销售额'].sum(),axis=1)

#以下等同上述 代码段。
df2['销售额'] = df2[['销售人员','地区']].apply(lambda x : df1['销售额'].loc[(df1.销售人员== x['销售人员'])&(df1.地区==x['地区'])].sum(),axis=1)


#打印x看一下输出: 如果 没有axis=1 ,会默认axis=0,按列进行操作,x 取值分别为:df2['销售人员']、df2['地区'],这样就会导致无法对多条件进行判断 ,
#因为 当 x为  df2['销售人员']的时候,df1.地区==x['地区']会报keyerror ‘地区’,因为此时没有地区这一列,coding的时候 一直耽误了较多时间,在此记录下来。
销售人员    张三
地区      湖北
Name: 0, dtype: object
销售人员    kaisi
地区         上海
Name: 1, dtype: object
销售人员    王五
地区      上海
Name: 2, dtype: object
销售人员    李四
地区      北京
Name: 3, dtype: object
销售人员    iii
地区       广东
Name: 4, dtype: object
posted @ 2022-01-09 23:48  烦恼1234  阅读(73)  评论(0编辑  收藏  举报