apply 是非常常用的一个函数,在处理数据过程中非常有效。因此,在此做一个分享总结。
在处理过程中,最麻烦的其实是涉及 axis =0 或者1 的问题。
在说明之前非常有必要要说明axis 的定义问题
df=pd.DataFrame({'a':[1,4],'b':[2,5],'c':[3,6]})
index | a | b | c |
---|---|---|---|
1 | 1 | 2 | 3 |
2 | 4 | 5 | 6 |
再提前要说明下apply 的运行机制,apply 后面会传进去一个向量,然后函数作用在这个向量上进行计算,然后会传出一个值或者向量或者其他,需要其他相应格式再承接出来。
然后要再区分开一个不同就是apply 作用的向量是row还是columns,如果是row那么axis=1,如果是columns,那么axis=0,(切记),而且axis=0 ,永远都是默认值。
然后再看,如果是axis=0,那么作用的是列,那么你会发现结果所有的行进行计算(就是说那么多行会发生挤压或者压缩或者扩张之类的变化)。
如下所示:
df.apply(np.sum)# 变成一个series
index | a |
---|---|
a | 5 |
b | 7 |
c | 9 |
或者也可以变成一个dataframe,这都是不同的函数导致,这个无所谓
df.apply(lambda x:x.head(1))
index | a | b | c |
---|---|---|---|
1 | 1 | 2 | 3 |
如果axis=1呢?
df.apply(np.sum,axis=1)# 变成一个series
index | value |
---|---|
0 | 6 |
1 | 15 |
所以总结下,当axis=0, 传进去函数的是列向量,但其实还是进行行运算,当axis=1, 传进去函数的是行向量,但其实还是进行列运算。
如果你是一个比较深入用pandas 的用户,你会发现
dropna axis=0 删除空值所在行
axis =1 删除空值所在列
drop axis=0 删除所在行
axis =1 删除所在列
其实在这里,也不矛盾,axis=0,默认的都是进行 行运算。
Series
不涉及axis 的问题,非常简单。