欢迎访问 生活随笔!

ag凯发k8国际

当前位置: ag凯发k8国际 > 编程语言 > c/c >内容正文

c/c

c map用法-ag凯发k8国际

发布时间:2024/10/14 c/c 23 豆豆
ag凯发k8国际 收集整理的这篇文章主要介绍了 c map用法_pandas数据处理三板斧——map、apply、applymap详解 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

在日常的数据处理中,经常会对一个dataframe进行逐行、逐列和逐元素的操作,对应这些操作,pandas中的map、apply和applymap可以解决绝大部分这样的数据处理需求。这篇文章就以案例附带图解的方式,为大家详细介绍一下这三个方法的实现原理,相信读完本文后,不论是小白还是pandas的进阶学习者,都会对这三个方法有更深入的理解。

本文演示的数据集是模拟生成的,想练手的可以按下方的代码生成。

boolean=[true,false] gender=["男","女"] color=["white","black","yellow"] data=pd.dataframe({"height":np.random.randint(150,190,100),"weight":np.random.randint(40,90,100),"smoker":[boolean[x] for x in np.random.randint(0,2,100)],"gender":[gender[x] for x in np.random.randint(0,2,100)],"age":np.random.randint(15,90,100),"color":[color[x] for x in np.random.randint(0,len(color),100) ] } )

数据集如下所示,各列分别代表身高、体重、是否吸烟、性别、年龄和肤色。

series数据处理

1. map用法

如果需要把数据集中gender列的男替换为1,女替换为0,怎么做呢?绝对不是用for循环实现,使用series.map()可以很容易做到,最少仅需一行代码。

#①使用字典进行映射 data["gender"] = data["gender"].map({"男":1, "女":0}) ​ #②使用函数 def gender_map(x):gender = 1 if x == "男" else 0return gender #注意这里传入的是函数名,不带括号 data["gender"] = data["gender"].map(gender_map)

那map在实际过程中是怎么运行的呢?请看下面的图解(为了方便展示,仅截取了前10条数据)

不论是利用字典还是函数进行映射,map方法都是把对应的数据逐个当作参数传入到字典或函数中,得到映射后的值。

2. apply

同时series对象还有apply方法,apply方法的作用原理和map方法类似,区别在于apply能够传入功能更为复杂的函数。怎么理解呢?一起看看下面的例子。

假设在数据统计的过程中,年龄age列有较大误差,需要对其进行调整(加上或减去一个值),由于这个加上或减去的值未知,故在定义函数时,需要加多一个参数bias,此时用map方法是操作不了的(传入map的函数只能接收一个参数),apply方法则可以解决这个问题。

def apply_age(x,bias):return x bias ​ #以元组的方式传入额外的参数 data["age"] = data["age"].apply(apply_age,args=(-3,))

可以看到age列都减了3,当然,这里只是简单举了个例子,当需要进行复杂处理时,更能体现apply的作用。

总而言之,对于series而言,map可以解决绝大多数的数据处理需求,但如果需要使用较为复杂的函数,则需要用到apply方法。

dataframe数据处理

1. apply

对dataframe而言,apply是非常重要的数据处理方法,它可以接收各种各样的函数(python内置的或自定义的),处理方式很灵活,下面通过几个例子来看看apply的具体使用及其原理。

在进行具体介绍之前,首先需要介绍一下dataframe中axis的概念,在dataframe对象的大多数方法中,都会有axis这个参数,它控制了你指定的操作是沿着0轴还是1轴进行。axis=0代表操作对列columns进行,axis=1代表操作对行row进行,如下图所示。

如果还不是很了解,没关系,下面会分别对apply沿着0轴以及1轴的操作进行讲解,继续往下走。

假设现在需要对data中的数值列分别进行取对数和求和的操作,这时可以用apply进行相应的操作,因为是对列进行操作,所以需要指定axis=0,使用下面的两行代码可以很轻松地解决我们的问题。

# 沿着0轴求和 data[["height","weight","age"]].apply(np.sum, axis=0) ​ # 沿着0轴取对数 data[["height","weight","age"]].apply(np.log, axis=0)

实现的方式很简单,但调用apply时究竟发生了什么呢?过程是怎么实现的?还是通过图解的方式来一探究竟。(取前五条数据为例)

当沿着轴0(axis=0)进行操作时,会将各列(columns)默认以series的形式作为参数,传入到你指定的操作函数中,操作后合并并返回相应的结果。

那如果在实际使用中需要按行进行操作(axis=1),那整个过程又是怎么实现的呢?

在数据集中,有身高和体重的数据,所以根据这个,我们可以计算每个人的bmi指数(体检时常用的指标,衡量人体肥胖程度和是否健康的重要标准),计算公式是:体重指数bmi=体重/身高的平方(国际单位kg/㎡),因为需要对每个样本进行操作,这里使用axis=1的apply进行操作,代码如下:

def bmi(series):weight = series["weight"]height = series["height"]/100bmi = weight/height**2return bmi ​ data["bmi"] = data.apply(bmi,axis=1)

还是用图解的方式来看看这个过程到底是怎么实现的(以前5条数据为例)。

当apply设置了axis=1对行进行操作时,会默认将每一行数据以series的形式(series的索引为列名)传入指定函数,返回相应的结果。

总结一下对dataframe的apply操作:

  • 当axis=0时,对每列columns执行指定函数;当axis=1时,对每行row执行指定函数。
  • 无论axis=0还是axis=1,其传入指定函数的默认形式均为series,可以通过设置raw=true传入numpy数组。
  • 对每个series执行结果后,会将结果整合在一起返回(若想有返回值,定义函数时需要return相应的值)
  • 当然,dataframe的apply和series的apply一样,也能接收更复杂的函数,如传入参数等,实现原理是一样的,具体用法详见官方文档。
  • 2. applymap

    applymap的用法比较简单,会对dataframe中的每个单元格执行指定函数的操作,虽然用途不如apply广泛,但在某些场合下还是比较有用的,如下面这个例子。

    为了演示的方便,新生成一个dataframe

    df = 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),} ) df

    现在想将dataframe中所有的值保留两位小数显示,使用applymap可以很快达到你想要的目的,代码和图解如下:

    df.applymap(lambda x:"%.2f" % x)

    相关文章:

  • pandas数据分析——超好用的groupby详解
  • pandas数据分析——merge数据拼接图文详解
  • pandas数据处理——玩转时间序列数据
  • pandas数据处理——盘点那些常用的函数(上)
  • pandas数据处理——盘点那些常用的函数(下)
  • 天秀!pandas还能用来写爬虫?
  • 提高数据的颜值!一起看看pandas中的那些style
  • 提速百倍的pandas性能优化方法,让你的pandas飞起来!
  • 原创不易,如果觉得有点用,希望可以点个赞,拜谢各位老铁!

    总结

    以上是ag凯发k8国际为你收集整理的c map用法_pandas数据处理三板斧——map、apply、applymap详解的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得ag凯发k8国际网站内容还不错,欢迎将ag凯发k8国际推荐给好友。

    网站地图