Pandas高级:map、apply和applymap

使用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.apply.html#pandas.DataFrame.apply

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.applymap.html

猜你喜欢

转载自blog.csdn.net/opp003/article/details/87071222