apply 是非常常用的一個函數(shù),在處理數(shù)據(jù)過程中非常有效。因此,在此做一個分享總結。
在處理過程中,最麻煩的其實是涉及 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 后面會傳進去一個向量,然后函數(shù)作用在這個向量上進行計算,然后會傳出一個值或者向量或者其他,需要其他相應格式再承接出來。
然后要再區(qū)分開一個不同就是apply 作用的向量是row還是columns,如果是row那么axis=1,如果是columns,那么axis=0,(切記),而且axis=0 ,永遠都是默認值。
然后再看,如果是axis=0,那么作用的是列,那么你會發(fā)現(xiàn)結果所有的行進行計算(就是說那么多行會發(fā)生擠壓或者壓縮或者擴張之類的變化)。
如下所示:
df.apply(np.sum)# 變成一個series
| index | a |
|---|---|
| a | 5 |
| b | 7 |
| c | 9 |
或者也可以變成一個dataframe,這都是不同的函數(shù)導致,這個無所謂
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, 傳進去函數(shù)的是列向量,但其實還是進行行運算,當axis=1, 傳進去函數(shù)的是行向量,但其實還是進行列運算。
如果你是一個比較深入用pandas 的用戶,你會發(fā)現(xiàn)
dropna axis=0 刪除空值所在行
axis =1 刪除空值所在列
drop axis=0 刪除所在行
axis =1 刪除所在列
其實在這里,也不矛盾,axis=0,默認的都是進行 行運算。
Series
不涉及axis 的問題,非常簡單。