数据转换函数对比: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()
|
日期 |
公司 |
收盘 |
开盘 |
高 |
低 |
交易量 |
涨跌幅 |
0 |
2019-10-03 |
BIDU |
104.32 |
102.35 |
104.73 |
101.15 |
2.24 |
0.02 |
1 |
2019-10-02 |
BIDU |
102.62 |
100.85 |
103.24 |
99.50 |
2.69 |
0.01 |
2 |
2019-10-01 |
BIDU |
102.00 |
102.80 |
103.26 |
101.00 |
1.78 |
-0.01 |
3 |
2019-10-03 |
BABA |
169.48 |
166.65 |
170.18 |
165.00 |
10.39 |
0.02 |
4 |
2019-10-02 |
BABA |
165.77 |
162.82 |
166.88 |
161.90 |
11.60 |
0.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 |
0 |
2019-10-03 |
BIDU |
104.32 |
102.35 |
104.73 |
101.15 |
2.24 |
0.02 |
百度 |
1 |
2019-10-02 |
BIDU |
102.62 |
100.85 |
103.24 |
99.50 |
2.69 |
0.01 |
百度 |
2 |
2019-10-01 |
BIDU |
102.00 |
102.80 |
103.26 |
101.00 |
1.78 |
-0.01 |
百度 |
3 |
2019-10-03 |
BABA |
169.48 |
166.65 |
170.18 |
165.00 |
10.39 |
0.02 |
阿里巴巴 |
4 |
2019-10-02 |
BABA |
165.77 |
162.82 |
166.88 |
161.90 |
11.60 |
0.00 |
阿里巴巴 |
方法2:Series.map(function)
function的参数是Series的每个元素的值
stocks["公司中文2"] = stocks["公司"].map(lambda x : dict_company_names[x.lower()])
stocks.head()
|
日期 |
公司 |
收盘 |
开盘 |
高 |
低 |
交易量 |
涨跌幅 |
公司中文1 |
公司中文2 |
0 |
2019-10-03 |
BIDU |
104.32 |
102.35 |
104.73 |
101.15 |
2.24 |
0.02 |
百度 |
百度 |
1 |
2019-10-02 |
BIDU |
102.62 |
100.85 |
103.24 |
99.50 |
2.69 |
0.01 |
百度 |
百度 |
2 |
2019-10-01 |
BIDU |
102.00 |
102.80 |
103.26 |
101.00 |
1.78 |
-0.01 |
百度 |
百度 |
3 |
2019-10-03 |
BABA |
169.48 |
166.65 |
170.18 |
165.00 |
10.39 |
0.02 |
阿里巴巴 |
阿里巴巴 |
4 |
2019-10-02 |
BABA |
165.77 |
162.82 |
166.88 |
161.90 |
11.60 |
0.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 |
0 |
2019-10-03 |
BIDU |
104.32 |
102.35 |
104.73 |
101.15 |
2.24 |
0.02 |
百度 |
百度 |
百度 |
1 |
2019-10-02 |
BIDU |
102.62 |
100.85 |
103.24 |
99.50 |
2.69 |
0.01 |
百度 |
百度 |
百度 |
2 |
2019-10-01 |
BIDU |
102.00 |
102.80 |
103.26 |
101.00 |
1.78 |
-0.01 |
百度 |
百度 |
百度 |
3 |
2019-10-03 |
BABA |
169.48 |
166.65 |
170.18 |
165.00 |
10.39 |
0.02 |
阿里巴巴 |
阿里巴巴 |
阿里巴巴 |
4 |
2019-10-02 |
BABA |
165.77 |
162.82 |
166.88 |
161.90 |
11.60 |
0.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 |
0 |
2019-10-03 |
BIDU |
104.32 |
102.35 |
104.73 |
101.15 |
2.24 |
0.02 |
百度 |
百度 |
百度 |
百度 |
1 |
2019-10-02 |
BIDU |
102.62 |
100.85 |
103.24 |
99.50 |
2.69 |
0.01 |
百度 |
百度 |
百度 |
百度 |
2 |
2019-10-01 |
BIDU |
102.00 |
102.80 |
103.26 |
101.00 |
1.78 |
-0.01 |
百度 |
百度 |
百度 |
百度 |
3 |
2019-10-03 |
BABA |
169.48 |
166.65 |
170.18 |
165.00 |
10.39 |
0.02 |
阿里巴巴 |
阿里巴巴 |
阿里巴巴 |
阿里巴巴 |
4 |
2019-10-02 |
BABA |
165.77 |
162.82 |
166.88 |
161.90 |
11.60 |
0.00 |
阿里巴巴 |
阿里巴巴 |
阿里巴巴 |
阿里巴巴 |
3. applymap用于DataFrame所有值的转换
sub_df = stocks[['收盘', '开盘', '高', '低', '交易量']]
sub_df.head()
|
收盘 |
开盘 |
高 |
低 |
交易量 |
0 |
104.32 |
102.35 |
104.73 |
101.15 |
2.24 |
1 |
102.62 |
100.85 |
103.24 |
99.50 |
2.69 |
2 |
102.00 |
102.80 |
103.26 |
101.00 |
1.78 |
3 |
169.48 |
166.65 |
170.18 |
165.00 |
10.39 |
4 |
165.77 |
162.82 |
166.88 |
161.90 |
11.60 |
# 将这些数字取整数,应用于所有元素
sub_df.applymap(lambda x : int(x))
|
收盘 |
开盘 |
高 |
低 |
交易量 |
0 |
104 |
102 |
104 |
101 |
2 |
1 |
102 |
100 |
103 |
99 |
2 |
2 |
102 |
102 |
103 |
101 |
1 |
3 |
169 |
166 |
170 |
165 |
10 |
4 |
165 |
162 |
166 |
161 |
11 |
5 |
165 |
168 |
168 |
163 |
14 |
6 |
16 |
15 |
16 |
15 |
10 |
7 |
15 |
15 |
15 |
15 |
8 |
8 |
15 |
16 |
16 |
15 |
11 |
9 |
28 |
28 |
28 |
27 |
8 |
10 |
28 |
28 |
28 |
27 |
9 |
11 |
28 |
28 |
28 |
27 |
10 |
# 直接修改原df的这几列
stocks.loc[:, ['收盘', '开盘', '高', '低', '交易量']] = sub_df.applymap(lambda x : int(x))
stocks.head()
|
日期 |
公司 |
收盘 |
开盘 |
高 |
低 |
交易量 |
涨跌幅 |
公司中文1 |
公司中文2 |
公司中文3 |
公司中文4 |
0 |
2019-10-03 |
BIDU |
104 |
102 |
104 |
101 |
2 |
0.02 |
百度 |
百度 |
百度 |
百度 |
1 |
2019-10-02 |
BIDU |
102 |
100 |
103 |
99 |
2 |
0.01 |
百度 |
百度 |
百度 |
百度 |
2 |
2019-10-01 |
BIDU |
102 |
102 |
103 |
101 |
1 |
-0.01 |
百度 |
百度 |
百度 |
百度 |
3 |
2019-10-03 |
BABA |
169 |
166 |
170 |
165 |
10 |
0.02 |
阿里巴巴 |
阿里巴巴 |
阿里巴巴 |
阿里巴巴 |
4 |
2019-10-02 |
BABA |
165 |
162 |
166 |
161 |
11 |
0.00 |
阿里巴巴 |
阿里巴巴 |
阿里巴巴 |
阿里巴巴 |
相关推荐