一、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)
##作用series
data['分类2']=data['品类'].apply(lambda x: class_group(x)) ## 因为是series,所以不存在axis
2、作用函数
##内置函数
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-ct
data['付款金额']=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传递的函数不能有多个参数
两者之间的区别:
- map传递的函数不能有多个参数,apply可以;
- map的作用对象只能是Series,apply既能是Series,也可以是DataFrame;
- map除了可以接收函数外还可以接收字典,apply只能传递函数;
三、reduce函数
定义:计算原理是将头两个元素传入函数计算,再把结果和第3个元素传入函数计算,再把结果和第4个元素计传入计算,依次类推计算,直到把最后一个计算完成,返回结果。
reduce(function,iterable)
function:必须传入的参数,且必须为两个
iterable:必须传入的参数,可以是列表或者元组
##例子
from functools import reduce
def add(x,y):
return x+y
reduce(add,[1,2,3,4,5,6,7,8,9,10])
##运用
import pandas as pd
from functools import reduce
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')
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'})
##使用reduce
df=[data1,data2,data3]
df_merge= reduce(lambda x,y: pd.merge(x,y,how='left',on=['分类']),df)
df_merge
适用于文件的联结的代码
import pandas as pd
import os
from datetime import datetime
from 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_merge
def 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 * x
squared_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() - 实现批量合并表等等