Pandas的数据转换函数

一、三种数据转换函数:map、apply、applymap

1.map:只用于Series,实现每个值->值的映射;
2.apply:既可以用于Series实现每个值的处理,也可以用于Dataframe实现某个轴的Series的处理;
3.applymap:只能用于DataFrame,用于处理该DataFrame的每个元素;

二、map用于Series值的转换

1.实例:将股票代码英文转换成中文名字
Series里面传入一个字典和函数都可以,即Series.map(dict) or Series.map(function)
import pandas as pd
df = pd.read_csv('./datas/read_test.csv')
df.head()
		date		prov	isp		pv		uv
	0	2020-04-26	hunan	cmnet	2000	1000
	1	2020-04-26	hunan	cmnet	3000	1500
	2	2020-04-26	hunan	cmcc	4000	1000
	3	2020-04-26	hubei	ctc		2500	1000
	4	2020-04-26	hubei	cmcc	2000	1000

1.1、方法一,用字典;Series.map(dict)
#isp中文映射,注意这里是小写
#设置字典和映射关系
dict_isp_names = {
    "cmnet": "中国移动",
    "cmcc": "中国联通",
    "ctc": "中国电信"
}
#使用map方法
#因为原来的DataFrame中没有isp1列,所以添加一个新的列,叫isp1,通过设置的字典和映射关系来添加
df["isp1"] = df["isp"].map(dict_isp_names)
df.head()
		date		prov	isp		pv		uv		isp1
	0	2020-04-26	hunan	cmnet	2000	1000	中国移动
	1	2020-04-26	hunan	cmnet	3000	1500	中国移动
	2	2020-04-26	hunan	cmcc	4000	1000	中国联通
	3	2020-04-26	hubei	ctc		2500	1000	中国电信
	4	2020-04-26	hubei	cmcc	2000	1000	中国联通
1.2、方法2:用函数;Series.map(function)
#function的参数是Series的每个元素的值
#使用map方法
#因为原来的DataFrame中没有isp2列,所以添加一个新的列,叫isp2,通过函数和字典的取值来添加
df["isp2"] = df["isp"].map(lambda x : dict_isp_names[x])
df.head()
		date		prov	isp		pv		uv		isp1	isp2
	0	2020-04-26	hunan	cmnet	2000	1000	中国移动	中国移动
	1	2020-04-26	hunan	cmnet	3000	1500	中国移动	中国移动
	2	2020-04-26	hunan	cmcc	4000	1000	中国联通	中国联通
	3	2020-04-26	hubei	ctc		2500	1000	中国电信	中国电信
	4	2020-04-26	hubei	cmcc	2000	1000	中国联通	中国联通
df['float_column'] = 5.67435
df.head()
			date	prov	isp		pv		uv		isp1	isp2	  float_column	
	0	2020-04-26	hunan	cmnet	2000	1000	中国移动	中国移动		5.67435	
	1	2020-04-26	hunan	cmnet	3000	1500	中国移动	中国移动		5.67435	
	2	2020-04-26	hunan	cmcc	4000	1000	中国联通	中国联通		5.67435	
	3	2020-04-26	hubei	ctc		2500	1000	中国电信	中国电信		5.67435	
	4	2020-04-26	hubei	cmcc	2000	1000	中国联通	中国联通		5.67435
#使用map方法
#对df['float_column']进行格式化,保留小数点后三位,并添加到新的列float_column_1中
df['float_column_1'] = df['float_column'].map(lambda x: '%.3f'%x)
df.head()
		date	prov	isp		pv		uv		isp1	isp2	float_column	float_column_1
0	2020-04-26	hunan	cmnet	2000	1000	中国移动	中国移动		5.67435		5.674
1	2020-04-26	hunan	cmnet	3000	1500	中国移动	中国移动		5.67435		5.674
2	2020-04-26	hunan	cmcc	4000	1000	中国联通	中国联通		5.67435		5.674
3	2020-04-26	hubei	ctc		2500	1000	中国电信	中国电信		5.67435		5.674
4	2020-04-26	hubei	cmcc	2000	1000	中国联通	中国联通		5.67435		5.674

三、apply用于Series和DataFrame的转换

Series.apply(function), 函数的参数是每个值
DataFrame.apply(function), 函数的参数是Series
1、Series.apply(function)
function的参数是Series的每个值
#使用apply方法
#因为原来的DataFrame中没有isp3列,所以添加一个新的列,叫isp3,用函数和字典取值来添加数据
df["isp3"] = df["isp"].apply(
    lambda x : dict_isp_names[x])
df.head()
	date		prov	isp		pv		uv		isp1	isp2		float_column	float_column_1	isp3
0	2020-04-26	hunan	cmnet	2000	1000	中国移动	中国移动		5.67435			5.674			中国移动
1	2020-04-26	hunan	cmnet	3000	1500	中国移动	中国移动		5.67435			5.674			中国移动
2	2020-04-26	hunan	cmcc	4000	1000	中国联通	中国联通		5.67435			5.674			中国联通
3	2020-04-26	hubei	ctc		2500	1000	中国电信	中国电信		5.67435			5.674			中国电信
4	2020-04-26	hubei	cmcc	2000	1000	中国联通	中国联通		5.67435			5.674			中国联通
2、DataFrame.apply(function)
function的参数是对应轴的Series
#使用apply方法,对'pv','uv'这两列进行求和,得到的新的数据添加到新的列'total'#axis = 1,代表列相加
#axis = 0,代表行相加
df['total'] = df[['pv','uv']].apply(lambda x : x.sum(),axis = 1)
df.head()
		date		prov	isp		pv		uv		isp1	isp2	total
	0	2020-04-26	hunan	cmnet	2000	1000	中国移动	中国移动	3000
	1	2020-04-26	hunan	cmnet	3000	1500	中国移动	中国移动	4500
	2	2020-04-26	hunan	cmcc	4000	1000	中国联通	中国联通	5000
	3	2020-04-26	hubei	ctc		2500	1000	中国电信	中国电信	3500
	4	2020-04-26	hubei	cmcc	2000	1000	中国联通	中国联通	3000
注意这个代码:
1、apply是在df[['pv','uv']]这个DataFrame上调用;
2、lambda x的x是一个Series,axis=1表示跨列,axis=0 表示跨行
#使用apply方法,对'pv','uv'这两列进行求和,得到的新的数据添加到新的行'total'中
df.loc['total'] = df[['pv','uv']].apply(lambda x : x.sum(), axis = 0)
df.tail()
		date		prov	isp		pv		uv		isp1	isp2	total
	8	2020-04-27	hunan	cmcc	2800.0	1600.0	中国联通	中国联通	4400.0
	9	2020-04-27	hubei	ctc		2600.0	1400.0	中国电信	中国电信	4000.0
	10	2020-04-27	hubei	cmcc	3800.0	1900.0	中国联通	中国联通	5700.0
	11	2020-04-27	hubei	ctc		2400.0	1900.0	中国电信	中国电信	4300.0
	total	NaN		NaN		NaN		34400.0	17100.0	NaN		 NaN	 NaN

四、applymap用于DataFrame所有值的转换

sub_df = df[['pv', 'uv']]
sub_df.head()	
		pv		uv
	0	2000.0	1000.0
	1	3000.0	1500.0
	2	4000.0	1000.0
	3	2500.0	1000.0
	4	2000.0	1000.0
# 将这些数字取整数,应用于所有元素
sub_df = sub_df.applymap(lambda x : int(x))
		pv		uv
	0	2000	1000
	1	3000	1500
	2	4000	1000
	3	2500	1000
	4	2000	1000

你可能感兴趣的:(pandas学习,python,开发语言,数据挖掘)