apply 赋予了pandas非常高灵活性。特别是配合上lambda函数之后,可以简化很多程序。特别是以行或者列处理问题的时候,非常方便
简单使用
首先,构建一个dataframe
import pandas as pd
d={'one':{'a':1,'b':2,'c':3,'d':4},'two':{'a':5,'b':6,'c':7,'d':8},'three':{'a':9,'b':10,'c':11,'d':12}}
df=pd.DataFrame(d)
#构建的dataframe如下:
print(df)
one two three
a 1 5 9
b 2 6 10
c 3 7 11
d 4 8 12
计算每一行的总和:
df['row_sum']=df.apply(lambda x: x.sum(),axis=1)
print(df)
one two three row_sum
a 1 5 9 15
b 2 6 10 18
c 3 7 11 21
d 4 8 12 24
计算每一列的总和:
df.loc['col_sum']=df.apply(lambda x: x.sum(),axis=0)
print(df)
one two three row_sum
a 1 5 9 15
b 2 6 10 18
c 3 7 11 21
d 4 8 12 24
col_sum 10 26 42 78
其实,计算每一列的总和还有更简便的方法:
df=pd.DataFrame(d)
df.loc['col_sum']=df.sum()
one two three
a 1 5 9
b 2 6 10
c 3 7 11
d 4 8 12
col_sum 10 26 42
apply是以df中的行或者列为单位的,其实就是一个series(或者简单理解就是一个list)。当axis=0时(默认),series对应的时df中的列,axis=1时,series对应的是df中的行。
apply处理方式是函数变换。简单点讲,就是apply的括号里面对应的是一个函数。
类似的,计算每一行的平均值
对于重新构建的dataframe
df=pd.DataFrame(d)
df['row_mean']=df.apply(lambda x:x.mean(),axis=1)
print(df)
one two three row_mean
a 1 5 9 5.0
b 2 6 10 6.0
c 3 7 11 7.0
d 4 8 12 8.0
计算每一列的最大值与最小值的差
对于上面的dataframe
df=pd.DataFrame(d)
df['d_value']=df.apply(lambda x: x.max()-x.min(),axis=1)
print(df)
one two three d_value
a 1 5 9 8
b 2 6 10 8
c 3 7 11 8
d 4 8 12 8
所以,pandas series 部分的知识还是需要的
apply函数
函数说明:
DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)
apply中的func不一定是要lambda这种匿名函数,对于def定义的函数也是适用的
对于传参,args中可以设定参数,但是参数的数目比def中定义的参数少一个,因为第一个参数是来自于df中的series
此时series类似于dict的性质(还是去学series这一部分的基础吧)