pandas中利用apply来对数据进行处理十分常见,也十分的方便,原因在于apply方法可以调用函数:
应用于dataframe的各个列
这里借用了一位老师的图:(充分说明了group到apply的过程)
In [45]: df = pd.DataFrame({'a':[1,2,1,2],'b':[3,4,5,6]})
In [46]: df
Out[46]:
a b
0 1 3
1 2 4
2 1 5
3 2 6
group可以直接使用默认函数方法,也可以和apply的结合使用:
In [49]: df.groupby('a').sum()
Out[49]:
b
a
1 8
2 10
In [52]: df.groupby('a').apply(sum)
Out[52]:
a b
a
1 2 8
2 4 10
当然也可以使用我们自己编写的函数:
def reduce(dx):
dx.sum() #在apply中函数不需要加(),但是在其他地方调用函数需要加上(),不要搞混了
return dx
In [60]: df.groupby('a').apply(reduce)
Out[60]:
a b
a
1 2 8
2 4 10
当调用函数,且需要加入其它参数时:
def reduce(dx,k):
dx = dx*k
return dx
In [73]: df.apply(reduce,axis=1,args=(2,))
Out[73]:
a b
0 2 6
1 4 8
2 2 10
3 4 12
多个参数:
def reduce(dx,k,kk):
dx = dx*k+kk
return dx
In [75]: df.apply(reduce,axis=1,args=(2,1,))
Out[75]:
a b
0 3 7
1 5 9
2 3 11
3 5 13
应用函数添加某列时:
def reduce(dx,k):
dx['c'] = dx['a']*k + dx['b']
return dx
In [77]: df.apply(reduce,axis=1,args=(2,))
Out[77]:
a b c
0 1 3 5
1 2 4 8
2 1 5 7
3 2 6 10
一个小练习:
In [32]: data
Out[32]:
Pclass Survived
0 3 0
1 3 0
2 2 0
3 3 0
4 3 0
5 3 0
6 3 0
7 2 0
8 3 0
9 3 0
10 3 0
11 1 0
12 1 0
13 2 0
14 1 0
15 2 0
16 2 0
这里我们有两列数据,完成通过Pclass的值,修改Survived为对应值(可以自行添加参数)
def reduce(dx):
if dx['Pclass'] == 1:
dx['Survived'] = 1
elif dx['Pclass'] == 2:
dx['Survived'] =2
elif dx['Pclass'] == 3:
dx['Survived'] = 3
else:
dx['Survived'] = 0
return dx
首先编写一个函数,再使用apply来调用
In [34]: data.apply(reduce,axis=1)
Out[34]:
Pclass Survived
0 3 3
1 3 3
2 2 2
3 3 3
4 3 3
5 3 3
6 3 3
7 2 2
8 3 3
9 3 3
10 3 3
11 1 1
12 1 1
13 2 2
14 1 1
15 2 2
16 2 2