> 技术文档 > python中的函数:apply、map、reduce、lambda函数_python apply函数

python中的函数:apply、map、reduce、lambda函数_python apply函数


一、apply函数

定义:apply函数在Pandas库中函数,应用对象是DataFrame或Series的行或列上,并返回一个新的DataFrame或Series。主要有两方面的功能:一是直接对DataFrame或者Series应用函数,二是对pandas中的groupby之后的聚合对象apply函数

DataFrame.apply(func, axis=0, broadcast=None, raw=False, result_type=None, args=(), **kwds) Series.apply(func, convert_dtype=True, args=(), **kwds)func:要应用于每行或每列的函数。可以是Python内置的函数、自定义函数、或者匿名函数。axis:指定函数是应用于行还是列。apply中的参数axis=1表示对【行】遍历,axis=0表示对【列】遍历。raw:布尔值,默认为False。如果为False,则将每行或每列作为Series传递给函数;如果为True,则传递原始的ndarray对象。args和**kwds:传递给函数的其他位置和关键字参数。##例子import pandas as pd data = pd.DataFrame({\"订单号\":[\'2957\',\'2990\',\'2961\',\'2957\',\'3000\',\'2991\',\'2960\',\'2959\'],  \"付款金额\":[3499,3599,3333,5656,7534,4576,2342,1599],  \"支付时间\":[20240818,20240817,20240820,20240811,20240821,20240807,20240818,20240801],  \"品类\":[\'凳子\',\'椅子\',\'桌子\',\'耳机\',\'手机\',\'鼠标\',\'抽纸\',\'刷子\'],  \"用户名称\":[\'李学勤\',\'李丹\',\'杨立\',\'王建国\',\'郭麒麟\',\'马云\',\'马化腾\',\'秦孝贤\'],  \"销售数量\":[1,1,1,2,2,1,1,1]  }) data[\'创建时间\']=pd.to_datetime(data[\'创建时间\'],format=\'%Y%m%d\')1、作用对象##作用DataFrame()def class_group(x): if x in (\'凳子\',\'椅子\',\'桌子机\'): return \'类别1\' elif x in (\'耳机\',\'手机\',\'鼠标\'): return \'类被2\' elif x in (\'抽纸\'): return \'类别3\' else: return \'无\' data[\'分类1\']=data.apply(lambda x: class_group(x[\'品类\']), axis=1)##作用seriesdata[\'分类2\']=data[\'品类\'].apply(lambda x: class_group(x)) ## 因为是series,所以不存在axis2、作用函数##内置函数data[\'sum\']=data[[\'付款金额\',\'运费\']].apply(lambda x: x.sum(),axis=1) ## ##匿名函数data[[\'付款金额\',\'运费\']]=data[[\'付款金额\',\'运费\']].apply(lambda x: x+10,axis=1) ##自定义函数 def class_group(x): if x in (\'凳子\',\'椅子\',\'桌子机\'): return \'类别1\' elif x in (\'耳机\',\'手机\',\'鼠标\'): return \'类别2\' elif x in (\'抽纸\'): return \'类别3\' else: return \'无\'data[\'分类1\']=data.apply(lambda x: class_group(x[\'品类\']), axis=1)3、参数:能接受多个参数def sta(x,sh,ct): return x+sh-ctdata[\'付款金额\']=data[\'付款金额\'].apply(sta,args=(20,-8))

二、map函数

定义:利用字典或者函数去对特定数据做映射,它主要用于对Series对象的值进行操作,它将传入的函数或字典应用于Series中的每个元素上,并返回一个新的Series

Series.map(self, arg, na_action=None)arg:参数类型是字典或者函数na_action:对NaN值是否参与,不参与na_tion=\"ignore\"##例子import pandas as pd data = pd.DataFrame({\"订单号\":[\'2957\',\'2990\',\'2961\',\'2957\',\'3000\',\'2991\',\'2960\',\'2959\'],  \"付款金额\":[3499,3599,3333,5656,7534,4576,2342,1599],  \"支付时间\":[20240818,20240817,20240820,20240811,20240821,20240807,20240818,20240801],  \"品类\":[\'凳子\',\'椅子\',\'桌子\',\'耳机\',\'手机\',\'鼠标\',\'抽纸\',\'刷子\'],  \"用户名称\":[\'李学勤\',\'李丹\',\'杨立\',\'王建国\',\'郭麒麟\',\'马云\',\'马化腾\',\'秦孝贤\'],  \"销售数量\":[1,1,1,2,2,1,1,1],  \"运费\":[20,30,40,50,70,20,50,40]  }) data[\'创建时间\']=pd.to_datetime(data[\'创建时间\'],format=\'%Y%m%d\')1、作用函数##函数:这里只接受一个参数def class_group(x): if x in (\'凳子\',\'椅子\',\'桌子\'): return \'类别1\' elif x in (\'耳机\',\'手机\',\'鼠标\'): return \'类别2\' elif x in (\'抽纸\'): return \'类别3\' else: return \'无\' data[\'分类\']=data[\'品类\'].map(class_group)##字典data[\'分类\']=data[\'品类\'].map({\'凳子\':\'类别1\',\'耳机\':\'类别2\',\'抽纸\':\'类别3\'})2、参数;map传递的函数不能有多个参数

两者之间的区别:

  1. map传递的函数不能有多个参数,apply可以;
  2. map的作用对象只能是Series,apply既能是Series,也可以是DataFrame;
  3. map除了可以接收函数外还可以接收字典,apply只能传递函数;

三、reduce函数

定义:计算原理是将头两个元素传入函数计算,再把结果和第3个元素传入函数计算,再把结果和第4个元素计传入计算,依次类推计算,直到把最后一个计算完成,返回结果。

reduce(function,iterable)function:必须传入的参数,且必须为两个iterable:必须传入的参数,可以是列表或者元组##例子from functools import reducedef add(x,y): return x+yreduce(add,[1,2,3,4,5,6,7,8,9,10])##运用import pandas as pd from functools import reducedata = pd.DataFrame({\"订单号\":[\'2957\',\'2990\',\'2961\',\'2957\',\'3000\',\'2991\',\'2960\',\'2959\'],  \"付款金额\":[3499,3599,3333,5656,7534,4576,2342,1599],  \"支付时间\":[20240818,20240817,20240820,20240811,20240821,20240807,20240818,20240801],  \"品类\":[\'凳子\',\'椅子\',\'桌子\',\'耳机\',\'手机\',\'鼠标\',\'抽纸\',\'刷子\'],  \"用户名称\":[\'李学勤\',\'李丹\',\'杨立\',\'王建国\',\'郭麒麟\',\'马云\',\'马化腾\',\'秦孝贤\'],  \"销售数量\":[1,1,1,2,2,1,1,1],  \"运费\":[20,30,40,50,70,20,50,40],  \"订单状态\":[\'付款\',\'退货\',\'付款\',\'退货\',\'结算\',\'退货\',\'退货\',\'结算\']  }) data[\'创建时间\']=pd.to_datetime(data[\'创建时间\'],format=\'%Y%m%d\')def class_group(x): if x in (\'凳子\',\'椅子\',\'桌子\'): return \'类别1\' elif x in (\'耳机\',\'手机\',\'鼠标\'): return \'类别2\' elif x in (\'抽纸\'): return \'类别3\' else: return \'无\' data[\'分类\']=data[\'品类\'].map(class_group)data1=data.loc[(data[\'订单状态\']==\'付款\') | (data[\'订单状态\']==\'结算\')].groupby(\'分类\')[\'付款金额\'].sum().to_frame().reset_index().rename(columns={\'付款金额\':\'gmv\'})data2=data.loc[(data[\'订单状态\']==\'退货\')].groupby(\'分类\')[\'付款金额\'].sum().to_frame().reset_index().rename(columns={\'付款金额\':\'退款gmv\'})data3=data.groupby(\'分类\')[\'付款金额\'].sum().to_frame().reset_index().rename(columns={\'付款金额\':\'gmv\'})##使用reducedf=[data1,data2,data3]df_merge= reduce(lambda x,y: pd.merge(x,y,how=\'left\',on=[\'分类\']),df)df_merge

适用于文件的联结的代码

import pandas as pdimport os from datetime import datetimefrom functools import reduce def merge_data(): df_list=[] file_names = os.listdir(r\"C:\\Users\\Desktop\") excel_file_names = [file_name for file_name in file_names if file_name.endswith(\'.xlsx\') or file_name.endswith(\'.xls\')] for i in new_file_names: excel_path = os.path.join(R\"C:\\Users\\Desktop\",i) current_df = pd.read_excel(excel_path) df_list.append(current_df) df_merge= reduce(lambda x,y: pd.merge(x,y,how=\'left\',on=[\'日期\',\'品牌\']),df_list) return df_mergedef save_data(): df=class_hf2() df.to_excel(r\"C:\\Users\\Desktop\\\\数据.xlsx\", index=False)if __name__ == \'__main__\': save_data()

四、lambda函数

定义:lambda函数是匿名函数,具有匿名性、简洁性。它不需要像普通函数那样有一个明确的函数名(当然,你可以将lambda函数赋值给一个变量,然后通过这个变量来调用它,但本质上它不需要函数名来定义),适用适用于简单的、一次性的计算或操作;

##匿名性square = lambda x: x * x##简洁性普通函数def square(x): return x * xsquared_nums = list(map(square, nums))匿名函数squared_nums = list(map(lambda x: x * x, nums))

注释:应用场景和apply、map、filter等高阶函数进行搭配使用

python,.map()和.apply()有什么区别?_python apply和map方法的区别-CSDN博客 Pandas入门篇(二)-------Dataframe篇3(进阶)(多个Dataframe的关联)(机器学习前置技术栈)_pandas dataframe concat-CSDN博客 map、apply、applymap的用法-CSDN博客 map、apply、applymap的用法-CSDN博客 python中reduce函数详解_reduce python-CSDN博客 python:merge() 搭配reduce() - 实现批量合并表等等