怎样使用Pandas的map和apply函数?

数据转换函数对比:map、apply、applymap:
1. map:只用于Series,实现每个值->值的映射;
2. apply:用于Series实现每个值的处理,用于Dataframe实现某个轴的Series的处理;
3. applymap:只能用于DataFrame,用于处理该DataFrame的每个元素;

1. map用于Series值的转换

实例:将股票代码英文转换成中文名字

Series.map(dict) or Series.map(function)均可

import pandas as pd
stocks = pd.read_excel('./datas/stocks/互联网公司股票.xlsx')
stocks.head()
日期公司收盘开盘交易量涨跌幅
02019-10-03BIDU104.32102.35104.73101.152.240.02
12019-10-02BIDU102.62100.85103.2499.502.690.01
22019-10-01BIDU102.00102.80103.26101.001.78-0.01
32019-10-03BABA169.48166.65170.18165.0010.390.02
42019-10-02BABA165.77162.82166.88161.9011.600.00
stocks["公司"].unique()
array(['BIDU', 'BABA', 'IQ', 'JD'], dtype=object)
# 公司股票代码到中文的映射,注意这里是小写
dict_company_names = {
    "bidu": "百度",
    "baba": "阿里巴巴",
    "iq": "爱奇艺", 
    "jd": "京东"
}

方法1:Series.map(dict)

stocks["公司中文1"] = stocks["公司"].str.lower().map(dict_company_names)
stocks.head()
日期公司收盘开盘交易量涨跌幅公司中文1
02019-10-03BIDU104.32102.35104.73101.152.240.02百度
12019-10-02BIDU102.62100.85103.2499.502.690.01百度
22019-10-01BIDU102.00102.80103.26101.001.78-0.01百度
32019-10-03BABA169.48166.65170.18165.0010.390.02阿里巴巴
42019-10-02BABA165.77162.82166.88161.9011.600.00阿里巴巴

方法2:Series.map(function)

function的参数是Series的每个元素的值

stocks["公司中文2"] = stocks["公司"].map(lambda x : dict_company_names[x.lower()])
stocks.head()
日期公司收盘开盘交易量涨跌幅公司中文1公司中文2
02019-10-03BIDU104.32102.35104.73101.152.240.02百度百度
12019-10-02BIDU102.62100.85103.2499.502.690.01百度百度
22019-10-01BIDU102.00102.80103.26101.001.78-0.01百度百度
32019-10-03BABA169.48166.65170.18165.0010.390.02阿里巴巴阿里巴巴
42019-10-02BABA165.77162.82166.88161.9011.600.00阿里巴巴阿里巴巴

2. apply用于Series和DataFrame的转换

  • Series.apply(function), 函数的参数是每个值
  • DataFrame.apply(function), 函数的参数是Series

Series.apply(function)

function的参数是Series的每个值

stocks["公司中文3"] = stocks["公司"].apply(
    lambda x : dict_company_names[x.lower()])
stocks.head()
日期公司收盘开盘交易量涨跌幅公司中文1公司中文2公司中文3
02019-10-03BIDU104.32102.35104.73101.152.240.02百度百度百度
12019-10-02BIDU102.62100.85103.2499.502.690.01百度百度百度
22019-10-01BIDU102.00102.80103.26101.001.78-0.01百度百度百度
32019-10-03BABA169.48166.65170.18165.0010.390.02阿里巴巴阿里巴巴阿里巴巴
42019-10-02BABA165.77162.82166.88161.9011.600.00阿里巴巴阿里巴巴阿里巴巴

DataFrame.apply(function)

function的参数是对应轴的Series

stocks["公司中文4"] = stocks.apply(
    lambda x : dict_company_names[x["公司"].lower()], 
    axis=1)

注意这个代码:
1、apply是在stocks这个DataFrame上调用;
2、lambda x的x是一个Series,因为指定了axis=1所以Seires的key是列名,可以用x[‘公司’]获取

stocks.head()
日期公司收盘开盘交易量涨跌幅公司中文1公司中文2公司中文3公司中文4
02019-10-03BIDU104.32102.35104.73101.152.240.02百度百度百度百度
12019-10-02BIDU102.62100.85103.2499.502.690.01百度百度百度百度
22019-10-01BIDU102.00102.80103.26101.001.78-0.01百度百度百度百度
32019-10-03BABA169.48166.65170.18165.0010.390.02阿里巴巴阿里巴巴阿里巴巴阿里巴巴
42019-10-02BABA165.77162.82166.88161.9011.600.00阿里巴巴阿里巴巴阿里巴巴阿里巴巴

3. applymap用于DataFrame所有值的转换

sub_df = stocks[['收盘', '开盘', '高', '低', '交易量']]
sub_df.head()
收盘开盘交易量
0104.32102.35104.73101.152.24
1102.62100.85103.2499.502.69
2102.00102.80103.26101.001.78
3169.48166.65170.18165.0010.39
4165.77162.82166.88161.9011.60
# 将这些数字取整数,应用于所有元素
sub_df.applymap(lambda x : int(x))
收盘开盘交易量
01041021041012
1102100103992
21021021031011
316916617016510
416516216616111
516516816816314
61615161510
7151515158
81516161511
9282828278
10282828279
112828282710
# 直接修改原df的这几列
stocks.loc[:, ['收盘', '开盘', '高', '低', '交易量']] = sub_df.applymap(lambda x : int(x))
stocks.head()
日期公司收盘开盘交易量涨跌幅公司中文1公司中文2公司中文3公司中文4
02019-10-03BIDU10410210410120.02百度百度百度百度
12019-10-02BIDU1021001039920.01百度百度百度百度
22019-10-01BIDU1021021031011-0.01百度百度百度百度
32019-10-03BABA169166170165100.02阿里巴巴阿里巴巴阿里巴巴阿里巴巴
42019-10-02BABA165162166161110.00阿里巴巴阿里巴巴阿里巴巴阿里巴巴

相关推荐

发表评论

电子邮件地址不会被公开。 必填项已用*标注