pandas的数据转换函数map、apply
·
几个数据转换函数的对比
- map:Pandas 2.1.0 之前:map 只能用于 Series,用于实现 每个值 -> 值 的映射。Pandas 2.1.0 及以后:map 也可以用于 DataFrame,用于对 DataFrame 的 每个元素 进行操作,这取代了之前 applymap 的功能。
- apply:用于Series实现每个值的处理,用于DataFrame实现某个轴的Series的处理(默认按列处理)。
- applymap:只能用于DataFrame,用于处理该DataFrame的每个元素。从 Pandas 2.1.0 开始被废弃。官方建议使用 DataFrame.map 替代 applymap。
map用于Series值的转换
语法说明
Series.map(arg, na_action=None)
- 将 Series 中的值根据输入的映射或函数进行转换。
- 用于将 Series 中的每个值替换为另一个值,这些值可以来自函数、字典或另一个 Series。
输入参数:
- arg:可以是函数、字典、或者 另外一个Series。
返回值:返回值是一个 Series 对象,其索引与调用该方法的原始 Series 相同。
示例
引入数据:
import pandas as pd
stock_df = pd.read_excel('./data/几家公司几天的股票.xlsx')
查看数据:

看看有哪些公司:

公司股票代码到公司名称的映射:
# 公司股票代码到公司名称的映射,注意,用的是小写
company_names_dict = {
'jd': '京东',
'bidu': '百度',
'baba': '阿里巴巴',
'tcehy': '腾讯'
}
Series.map(传入字典)
stock_df['公司中文名称1'] = stock_df['公司'].str.lower().map(company_names_dict)
查看结果:

Series.map(传入函数)
stock_df['公司中文名称2'] = stock_df['公司'].map(lambda x : company_names_dict[x.lower()])
查看结果:

apply函数用于Series和DataFrame的转换
Series.apply
Series.apply(func, convert_dtype=<no_default>, args=(), *, by_row='compat', **kwargs)
当在Series上调用apply时,传入func的参数是每个值。
当前的DataFrame:

stock_df['公司中文名称3'] = stock_df['公司'].apply(lambda x : company_names_dict[x.lower()])
查看此时的DataFrame:

DataFrame.apply
DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), by_row='compat', engine='python', engine_kwargs=None, **kwargs)
当在DataFrame上调用apply时,传入func的参数是对应轴的Series。
下面在DataFrame上执行apply操作:
stock_df['公司中文名称4'] = stock_df.apply(lambda x : company_names_dict[x['公司'].lower()], axis=1)
注意:
上面的代码,lambda x 的 x是一个Series,因为指定了axis=1,所以Series是跨列的(跨列的意思是传入了一行数据),key是列名,可以用x[‘公司’]获取。
查看执行后的结果:

map用于DataFrame所有值的转换
语法
DataFrame.map(func, na_action=None, **kwargs)
map方法将一个接受并返回标量的函数应用于 DataFrame 的每一个元素。
示例
先获取一个新的DataFrame:
sub_df = stock_df[['收盘', '开盘', '高', '低', '交易量']]
查看新的DataFrame:

将DataFrame中的每个数值都转换为整数:
sub_df.map(lambda x : int(x))
查看结果:

更多推荐

所有评论(0)