2017-09-14 71 views

回答

4

不同的用例。比較它們時,最好帶上applyagg

設置

np.random.seed([3,1415]) 
df = pd.DataFrame(np.random.randint(10, size=(6, 4)), columns=list('ABCD')) 

df 

    A B C D 
0 0 2 7 3 
1 8 7 0 6 
2 8 6 0 2 
3 0 4 9 7 
4 3 2 4 3 
5 3 6 7 7 

pd.DataFrame.applymap
這需要一個函數,並返回與該函數的結果的新數據幀被施加到值在每個小區和更換的值結果的單元格。

df.applymap(lambda x: str(x) * x) 

      A  B   C  D 
0     22 7777777  333 
1 88888888 7777777    666666 
2 88888888 666666     22 
3    4444 999999999 7777777 
4  333  22  4444  333 
5  333 666666 7777777 7777777 

pd.DataFrame.agg
採用一個或多個功能。預計每個功能都是聚合功能。含義是每個函數應用於每個列,並且預期會返回替換整個列的單個值。示例將是'mean''max'。這兩種都需要一組數據並返回一個標量。

df.agg('mean') 

A 3.666667 
B 4.500000 
C 4.500000 
D 4.666667 
dtype: float64 

或者

df.agg(['mean', 'std', 'first', 'min']) 

      A   B   C   D 
mean 3.666667 4.500000 4.500000 4.666667 
std 3.614784 2.167948 3.834058 2.250926 
min 0.000000 2.000000 0.000000 2.000000 

pd.DataFrame.transform
注意到,預計將被施加到柱上,並返回相同大小的列一個功能。

df.transform(lambda x: x/x.std()) 

      A   B   C   D 
0 0.000000 0.922531 1.825742 1.332785 
1 2.213133 3.228859 0.000000 2.665570 
2 2.213133 2.767594 0.000000 0.888523 
3 0.000000 1.845062 2.347382 3.109832 
4 0.829925 0.922531 1.043281 1.332785 
5 0.829925 2.767594 1.825742 3.109832 

pd.DataFrame.apply
熊貓試圖找出如果apply是減少它是在(又名,聚合)操作列的維數,或者如果將所述柱成等於另一列尺寸。當它算出來時,它將運行剩餘的操作,就像它是一個聚合或轉換過程一樣。

df.apply('mean') 

A 3.666667 
B 4.500000 
C 4.500000 
D 4.666667 
dtype: float64 

或者

df.apply(lambda x: (x - x.mean())/x.std()) 

      A   B   C   D 
0 -1.014353 -1.153164 0.652051 -0.740436 
1 1.198781 1.153164 -1.173691 0.592349 
2 1.198781 0.691898 -1.173691 -1.184698 
3 -1.014353 -0.230633 1.173691 1.036611 
4 -0.184428 -1.153164 -0.130410 -0.740436 
5 -0.184428 0.691898 0.652051 1.036611 
+0

謝謝,但你沒有回答我的問題 – darcyq

+0

@darcyq applymap通常很慢。雖然它的最後幾個版本變得更好了。看看我的例子,並試圖找出你的其他問題的答案。 – piRSquared

+0

欣賞你的答案@piRSquared。我之前在熊貓文檔中實際上讀過你的答案。我顯然可以閱讀源代碼,但在我花時間做這件事之前,我想看看有沒有人知道它的頭頂。 – darcyq

0

我新的大熊貓,並試圖找到答案同樣的問題。我發現這個大熊貓網站(https://pandas.pydata.org/pandas-docs/stable/basics.html

因爲不是所有的功能都可以矢量(接受與NumPy陣列和 返回另一個數組或值),該方法applymap()上的數據幀 和類似地圖()在Series上接受任何一個取值爲 且返回單個值的Python函數。

我認爲這意味着傳遞給變換的函數應該是向量化的,整個系列將作爲參數傳遞給這些函數。傳遞給map(和applymap)的函數不需要進行矢量化,並且每個元素都將傳遞給該函數,因爲map會迭代該系列。