一、Pandas的数据转换函数map、apply、applymap
数据转换函数对比:map、apply、applymap:
- map:只用于Series,实现每个值 --> 值的映射:
- apply:用于Series实现每个值的处理,用于Dataframe实现某个轴的Series的处理;
- applymap:只能用于DataFrame,用于处理该DataFrame的每个元素
二、map用于Series值的转换
实例:将股票代码英文名字转成中文名字
Series.map(dict) or Series.map(function)
fpath = '/Users/python/Desktop/means/ml-25m/互联网公司股票.xlsx'
df = pd.read_excel(fpath)
df.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
获取公司的种类
df['公司'].unique()
array(['BIDU', 'BABA', 'IQ', 'JD'], dtype=object)
# 定义基本的映射关系:公司股票代码映射到中文,注意:这里是小写
df_company_names = {
'bidu': '百度',
'baba': '阿里巴巴',
'iq': '爱奇艺',
'jd': '京东'
}
第一种: Series.map(dict)
df 后面添加一列中文公司1,使用了Series.map(dict)
首先获取df公司列的数据,然后将其转位小写,最后使用map函数做一下关系映射
df['中文公司'] = df['公司'].str.lower().map(df_company_names)
第二种:Series.map(func)
function的参数是Series的每个元素的值
df['中文公司'] = df['公司'].str.lower().map(lambda x: df_company_names[x.lower()])
日期 公司 收盘 开盘 高 低 交易量 涨跌幅 中文公司
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 阿里巴巴
三、apply用于Series和DataFrame的转换
Series.apply(function),函数的参数是每个值
DataFrame.apply(function),函数的参数是Series
Series.apply(function)
function的参数是Series的每个值
当其为Series时,Series.map 与 Series.apply 通用选取df['公司'] Series.apply(func) x为Series的值 df['中文公司'] = df['公司'].apply(lambda x: df_company_names[x.lower()]) 日期 公司 收盘 开盘 高 低 交易量 涨跌幅 中文公司 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的参数是对应轴的Seriesdf为DataFrame;axis==1为扫描跨列;x为Series每个列的名字,x['公司']为取出列的值; 设置 columns axis==1; 设置 index axis==0 df['中文公司'] = df.apply(lambda x: df_company_names[x['公司'].lower()], axis=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 阿里巴巴
四、applymap 用于DataFrame所有值的转换
sub_df = df[['收盘', '开盘', '高', '低', '交易量']]
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中的所有值,获取整数,适用于所有元素
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
把新的sub_df的列赋值给原来的df相同的列
df.loc[:, ['收盘', '开盘', '高', '低', '交易量']] = sub_df.applymap(lambda x: int(x))
日期 公司 收盘 开盘 高 低 交易量 涨跌幅 中文公司
0 2019-10-03 BIDU 104.0 102.0 104.0 101.0 2.0 0.02 百度
1 2019-10-02 BIDU 102.0 100.0 103.0 99.0 2.0 0.01 百度
2 2019-10-01 BIDU 102.0 102.0 103.0 101.0 1.0 -0.01 百度
3 2019-10-03 BABA 169.0 166.0 170.0 165.0 10.0 0.02 阿里巴巴
4 2019-10-02 BABA 165.0 162.0 166.0 161.0 11.0 0.00 阿里巴巴