2014-02-12 160 views
5

我想試用方法的Pandas DataFrame對象的功能。下面是使用案例:熊貓DataFrame ApplyMap方法

讓說我的數據幀df1如下:

Age ID  Name 
0 27 101 John 
1 22 102 Bob 
2 19 103 Alok 
3 27 104 Tom 
4 32 105 Matt 
5 19 106 Steve 
6 5 107 Tom 
7 55 108 Dick 
8 67 109 Harry 

現在我想創建一個標誌變量與邏輯,如果元素的長度小於2,則標誌= 1 else flag = 0。

爲了運行這個元素,我想使用applymap方法。所以,我創建了一個用戶定義的函數如下:

def f(x): 
    if len(str(x))>2: 
     df1['Flag']=1 
    else: 
     df1['Flag']=0 

然後我跑df1.applymap(f)這給:

Age ID Name 
0 None None None 
1 None None None 
2 None None None 
3 None None None 
4 None None None 
5 None None None 
6 None None None 
7 None None None 
8 None None None 

,而不是創建一個具有標誌值一個標誌變量。我如何使用applymap實現所需的功能?

我們不能在用戶定義函數內使用DataFrame變量名稱或pandas語句嗎?也就是df1['Flag']裏面有效的f()的定義?

回答

8

函數f(x)對於熊貓來說並不特別 - 它只是一個普通的python函數。因此,f範圍內的唯一數據是變量xdf1的其他成員不可用。

applymap文檔:

FUNC:功能

Python的功能,從單一的值返回一個值

所以,你可以試試這個:

def f(x): 
    if len(str(x)) <= 3: return 1 
    else: return 0 

爲每個元素輸出1/0施加當幀:

df1.applymap(f) 

>>> 
    Age ID Name 
0 1 1  0 
1 1 1  1 
2 1 1  0 
3 1 1  1 
4 1 1  0 
5 1 1  0 
6 1 1  1 
7 1 1  0 
8 1 1  0 

使用該結果來添加另一變量在每一行中,則需要每行一個值,例如,

df1['Flag'] = df1.applymap(f).all(axis=1).astype(bool) 

>>> df1 

    Age ID Name Flag 
0 27 101 John False 
1 22 102 Bob True 
2 19 103 Alok False 
3 27 104 Tom True 
4 32 105 Matt False 
5 19 106 Steve False 
6 5 107 Tom True 
7 55 108 Dick False 
8 67 109 Harry False 

還檢查了https://stackoverflow.com/a/19798528/1643946覆蓋applymap如以及applymap

+0

謝謝。只是後續行動。在df1 ['Flag'] = df1.applymap(f).sum(axis = 1).astype(bool)語句中,當我們按列求和時,第一行的值應該爲2(1 + 1 +0)?那麼bool應該是真實的儀式?那麼爲什麼它是假的? – Baktaawar

+0

是的,對不起 - 我從'all'函數中複製了結果,但是在sum函數中寫入了結果(bool(sum)給出了所有行的True,這不是一個好例子)。現在修復。 – Bonlenfum

+0

@Baktaawar如果這解決了您的問題,那麼除了「謝謝」之外,如果您能接受答案,這將非常棒! – Owen