使用Pandas进行数据处理时,常用的映射函数有三种:map(),apply()和applymap()。
map()函数是Python自带的,它只能用于一维数组。在Pandas中使用时,只能用于Series类型或者DataFrame中的某一列/行。
apply()和applymap()是Pandas中的函数。他们可以用于一维或者多维数组。
1.map
map() 会根据提供的函数对指定序列做映射。
创建一个DataFrame:
df = pd.DataFrame({'col1':np.arange(1,4),'col2':['A','B','C']},index=['a','b','c'])
输出:
col1 col2
a 1 A
b 2 B
c 3 C
使用map()映射:
df['col3'] = df['col1'].map(lambda x : "%.3f"%x)
df['col4'] = df['col1'].map({1:'A1',2:'B2',3:'C3'})
输出:
col1 col2 col3 col4
a 1 A 1.000 A1
b 2 B 2.000 B2
c 3 C 3.000 C3
2.apply
使用apply()函数对DataFrame中的每一行或者每一列执行自定义函数。
创建一个DataFrame:
df = pd.DataFrame({'col1':['1','2','3'],'col2':['A','B','C'],'col3':np.arange(1,4)},index=['a','b','c'])
输出:
col1 col2 col3
a 1 A 1
b 2 B 2
c 3 C 3
可以用lambda方法简化代码:
#下面两种写法一样
df['col4'] = df[['col1','col2']].apply(lambda x : str(x['col1'])+x['col2'],axis=1)
df['col5'] = df.apply(lambda x : str(x['col1'])+x['col2'],axis=1)
输出:
col1 col2 col4 col5
a 1 A 1A 1A
b 2 B 2B 2B
c 3 C 3C 3C
也可以自定义函数,然后用apply方法应用该函数:
#第三列为数值型,需转成字符型
def my_func(data):
col2 = data['col2']
col3 = data['col3']
col3 = str(col3)
new_col = col3 + col2
return new_col
df['col7'] = df.apply(my_func,axis=1)
输出:
col1 col2 col3 col7
a 1 A 1 1A
b 2 B 2 2B
c 3 C 3 3C
上面都是对行的操作,再来看看对列的操作,即axis=0。自定义一个函数:
#将每一列中的每一个元素相加
def my_func(data):
a = data.iloc[0]
b = data.iloc[1]
c = data.iloc[2]
d = a + b + c
return d
#将得到的新值赋给新行-d
df.loc['d']= df.apply(my_func,axis=0)
输出:
col1 col2 col3
a 1 A 1
b 2 B 2
c 3 C 3
d 123 ABC 6
3.applymap
最后一个applymap()函数用的较少,因为很多时候可以用apply函数代替它。它的作用是将DataFrame中每一个元素都应用一遍自定义的函数。
下面用一个官方的列子展示它的用法。创建一个DataFrame:
df = pd.DataFrame([[1, 2.12], [3.356, 4.567]])
输出:
0 1
0 1.000 2.120
1 3.356 4.567
使用applymap方法对每一个元素求长度:
df.applymap(lambda x: len(str(x)))
输出:
0 1
0 3 4
1 5 5
或者:
df.applymap(lambda x: x**2)
输出:
0 1
0 1.000000 4.494400
1 11.262736 20.857489
以上就是关于map,apply和applymap的用法,其实三者大同小异,可以互通,最常用的还是map和apply两种方法。
参考资料:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.applymap.html