在进行数据处理时,经常会对一个DataFrame展开逐行、逐列、逐元素的操作,对应这些操作,常常使用Pandas中的map、apply和applymap三个函数进行处理。本文主要讲这三个函数在series、dataframe数据结构下应用情况及三个函数的区别。
模拟的样本数据
boolean=[True,False]
channel=["T","N"]
data=pd.DataFrame({
"A":np.random.randint(150,190,10),
"B":np.random.randint(40,90,10),
"C":[boolean[x] for x in np.random.randint(0,2,10)],
"D":[channel[x] for x in np.random.randint(0,2,10)]
}
)
data
举例:
要求:将D列中”N“换为0,”T“为1。
data['D']=data['D'].map({'N':0,'T':1})
data
举例:
要求:将D列中”N“换为0,”T“为1。
def func(values):
if values=='N':
return 0
else:
return 1
data['D']=data['D'].map(func)
data
不管是利用字典还是函数进行映射,map方法都是把对应的数据逐个当作参数传入到字典或函数中,得到映射后的值。
举例:
要求:将D列中”N“换为0,”T“为1。
def func(values):
if values=='N':
return 0
else:
return 1
data['D']=data['D'].apply(func)
data
举例:
要求:将A列中所有数值减去100。
def func(values,x):
return values+x
data['A']=data['A'].apply(func,args=(-100,))
data
举例:
要求:将D列中”N“换为0,”T“为1。
data['D']=data['D'].apply({'N':0,'T':1})
data
举例1
要求:对比A、B两列,求每行最大值
import numpy as np
data[['A','B']].apply(np.max,axis=1)
import numpy as np
data[['A','B']].apply(np.max,axis=0)
举例:
要求:将dataframe中所有的值保留两位小数显示,使用applymap可以很快达到你想要的目的
import pandas as pd
data = pd.DataFrame(
{
"A":np.random.randn(5),
"B":np.random.randn(5),
"C":np.random.randn(5),
"D":np.random.randn(5),
"E":np.random.randn(5),
}
)
data
data .applymap(lambda x:"%.2f" % x)
map:应用在单独一个Series的每个元素中,只针对单列。
apply:应用在DataFrame的行或列中,也可以应用到单独一个Series的每个元素中,针对多列,也可以单列。
applymap:应用在DataFrame的每个元素中。针对DataFrame全部元素。apply想要直接对每个元素进行操作,得单独取出serires才可以实现,不能直接在整个DataFrame上执行。
参考文章:
https://zhuanlan.zhihu.com/p/100064394
https://zhuanlan.zhihu.com/p/133722455
https://zhuanlan.zhihu.com/p/584036056