pandas(二十)数据转换函数map、apply、applymap

一、Pandas的数据转换函数map、apply、applymap

数据转换函数对比:map、apply、applymap:

  1. map:只用于Series,实现每个值 --> 值的映射:
  2. apply:用于Series实现每个值的处理,用于Dataframe实现某个轴的Series的处理;
  3. 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的参数是对应轴的Series
    df为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	阿里巴巴

猜你喜欢

转载自blog.csdn.net/a6864657/article/details/131656108