• 售前

  • 售后

热门帖子
入门百科

pandas map(),apply(),applymap()区别解析

[复制链接]
尹泽汐猩 显示全部楼层 发表于 2021-10-25 20:34:41 |阅读模式 打印 上一主题 下一主题
底子
以下操作基于python 3.6 windows 10 环境下 通过
将通过实例来演示三者的区别
  1. toward_dict = {1: '东', 2: '南', 3: '西', 4: '北'}
  2. df = pd.DataFrame({'house' : list('AABCEFG'),
  3.           'price' : [100, 90, '', 50, 120, 150, 200],
  4.           'toward' : ['1','1','2','3','','3','2']})
  5. df
复制代码

map()方法

通过df.(tab)键,发现df的属性列表中有apply() 和 applymap(),但没有map().
map()是python 自带的方法, 可以对df某列内的元素进行操作, 我个人最常用的场景就是有
  1. toward_dict
复制代码
的映射关系 ,为df中的
  1. toward
复制代码
匹配出效果,
  1. df['朝向'] = df.toward.map(toward_dict);df
复制代码


效果就是没有匹配出来, why???
因为
  1. df.toward
复制代码
这列数字是str型的,
  1. toward_dict
复制代码
中的key是int型,下面修正操作下:两个思路:
  1. 第一种思路:`toward_dict`的key转换为str型
  2. toward_dict2 = dict((str(key), val) for key, val in toward_dict.items())
复制代码
  1. # 第二种思路, 将df.toward转为int型
  2. df.toward = df.toward.map(lambda x: np.nan if x == '' else x).map(int,na_action='ignore')
  3. df['朝向2'] = df.toward.map(toward_dict);df
复制代码

apply() 方法

更新时间: 2018-08-10
我目前的现实工作中使用
  1. apply()
复制代码
方法比较少, 所以整理的内容比较简陋, 后续涉及到数据分析方面可能会应用比较多些.
先将上面的测试中的
  1. map
复制代码
更换为
  1. apply
复制代码
,看看怎么样?
效果报错了,
  1. ValueError
复制代码
, 还是老诚实实写现实操作例子吧 ?
参考DataFrame.apply官方文档
文档中第一个参数:
  1. func : function
  2. Function to apply to each column or row.
复制代码
意思便是, 将传入的
  1. func
复制代码
应用到每一列或每一行,进行元素级别的运算
第二个参数:
  1. axis : {0 or ‘index', 1 or ‘columns'}, default 0
  2. Axis along which the function is applied:
  3. 0 or ‘index': apply function to each column. # 注意这里的解释
  4. 1 or ‘columns': apply function to each row.
复制代码
举例:


这个要特殊注意的,
没有继承使用map里的DF, 是因为df.house是字符串, 不能进行
  1. np.sum
复制代码
运算,会报错.
  1. 2018年12月3日
复制代码
新增:
近来在工作中使用到了
  1. pandas.apply()
复制代码
方法,更新如下:
配景介绍:

一个
  1. df
复制代码
有三个列必要进行计算,
  1. change_type
复制代码
值 为1和0, 1为涨价,0为降价,
  1. price
复制代码
为现价,
  1. changed
复制代码
为涨降价的绝对值, 现求:涨降价的比例, 正确到0位,无小数位,
办理思路:
1.最重要的计算是: 涨降价的绝对值/ 原价
2.最重要的难点是: 涨价的原价 = 现价 - 绝对值
降价的原价 = 现价 + 绝对值
伪代码如下: 涨降价比例 = round(changed/(price 加上或减去 changed), 0)
就是我需求的效果了.
办理方案 如下:
  1. 以下代码经过win 10 环境 python3.6 版本测试通过
复制代码
  1. import pandas as pd
  2. df = pd.DataFrame({'change_type' : [1,1,0,0,1,0],
  3.           'price' : [100, 90, 50, 120, 150, 200],
  4.           'changed' : [10,8,4,11,14,10]})
  5. def get_round(change_type, price, changed_val):
  6.         """
  7.         策略设计
  8.         """
  9.         if change_type == 0:
  10.                 return round(changed_val/(price + changed_val) * 100, 2)
  11.         elif change_type == 1:
  12.                 return round(changed_val/(price - changed_val) * 100, 2)
  13.         else:
  14.                 print(f'{change} is not exists')
  15. # 策略实现
  16. df['round'] = df.apply(lambda x: get_round(x['change_type'], x['price'], x['changed']),axis=1)
复制代码
若有题目, 接待指正, 谢谢
applymap()

参考DataFrame.applymap官方文档:
  1. func : callable
  2. Python function, returns a single value from a single value.
复制代码
文档很简单, 只有一个参数, 即传入的
  1. func
复制代码
方法
样例参考文档吧, 没有比这个更简单了
总结:

map() 方法是pandas.series.map()方法, 对DF中的元素级别的操作, 可以对df的某列或某多列, 可以参考文档
apply(func) 是DF的属性, 对DF中的行数据或列数据应用
  1. func
复制代码
操作.
applymap(func) 也是DF的属性, 对整个DF全部元素应用
  1. func
复制代码
操作
到此这篇关于pandas map(),apply(),applymap()区别剖析的文章就介绍到这了,更多相关pandas map(),apply(),applymap()内容请搜刮脚本之家从前的文章或继承欣赏下面的相关文章盼望各人以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作