很多情况下我们需要对DataFrame数据进行清洗,此时apply方法可以起到非常高效的作用。
例如有这样一组数据:
In [18]: d = pd.DataFrame(np.random.random((10, 5)))
In [19]: d
Out[19]:
0 1 2 3 4
0 0.792077 0.607113 0.138183 0.601367 0.685311
1 0.060277 0.293252 0.053273 0.096471 0.197612
2 0.119790 0.568516 0.110619 0.178408 0.630950
3 0.337864 0.741840 0.713783 0.336010 0.476778
4 0.561687 0.781477 0.275754 0.266411 0.027979
5 0.435815 0.763327 0.335057 0.594844 0.742208
6 0.651170 0.475181 0.378627 0.389659 0.228421
7 0.855141 0.422915 0.761558 0.372822 0.451638
8 0.618746 0.961825 0.624242 0.315790 0.035062
9 0.419395 0.017075 0.722718 0.404673 0.287262
生成第6列数据,其中,当第4列数据>0.5时,第6列数据等于第1和第3列数据之和,否则第6列数据等于第1列数据。
In [22]: d['fun'] = d.apply(lambda x: x[0]+x[2] if x[4]>0.5 else x[0], axis=1)
In [23]: d
Out[23]:
0 1 2 3 4 fun
0 0.792077 0.607113 0.138183 0.601367 0.685311 0.930260
1 0.060277 0.293252 0.053273 0.096471 0.197612 0.060277
2 0.119790 0.568516 0.110619 0.178408 0.630950 0.230409
3 0.337864 0.741840 0.713783 0.336010 0.476778 0.337864
4 0.561687 0.781477 0.275754 0.266411 0.027979 0.561687
5 0.435815 0.763327 0.335057 0.594844 0.742208 0.770872
6 0.651170 0.475181 0.378627 0.389659 0.228421 0.651170
7 0.855141 0.422915 0.761558 0.372822 0.451638 0.855141
8 0.618746 0.961825 0.624242 0.315790 0.035062 0.618746
9 0.419395 0.017075 0.722718 0.404673 0.287262 0.419395
注意,上面的x[0]+x[2] if x[4]>0.5 else x[0], axis=1可以用一个自定义函数代替,例如:
def foo(x, y, z):
if z > 0.5:
return x + y
else:
return x
d['fun'] = d.apply(lambda x: foo(x[0], x[2], x[4]), axis=1)
基于这个方法,可以做很多操作,例如判断某列是否含有特定值,如果有特定值,就进行一个处理,判断任意几列是否存在某种依赖关系,如果存在,进行一个特殊处理,等等。