2017-02-10 73 views
1

我有以下的數據幀製作的多個參數中的大熊貓功能

data=pd.DataFrame({'a':range(6),'b':range(6)}) 

我通過這段代碼創建一個「c」列和過濾器值:

data['c']=0 
data.c[(data.a<=3)&(data.b<=3)]='small' 
data.c[(data.a>3)&(data.b>3)]='big' 

有什麼辦法創造像DEF(X,Y,Z)的函數的(X,y,z是等效於A,b,C),與此類似:

def(x,y,z): 
    if(x<=3)&(y<=3): 
     z='small' 
    if(x>3)& (y>3): 
     z='big' 

回答

0

如果必須編寫一個函數,那麼您可以使用applyaxis=1,這會將每行作爲一系列傳遞給調用函數。可以使用np.where。無需編寫功能

data['c'] = np.where((data.a > 3) & (data.b >3), 'big', 'small') 

    a b  c 
0 0 0 small 
1 1 1 small 
2 2 2 small 
3 3 3 small 
4 4 4 big 
5 5 5 big 
+0

該示例只是一個過分簡化的版本。我需要的是用一些參數編寫一個函數,然後我可以將它應用於其他數據。 – ducvu169

+0

我更新了使用函數的答案 –

+0

需要很多,但這不是我真正需要的。例如,如果我用x(相當於a)和y(相當於b)來討論數據,那麼我怎樣才能調用這個函數呢? – ducvu169

0

當然。你幾乎做到了:

def func(data,x,y,z): 
    if (data[x]<=3)&(data[y]<=3): 
     data[z]="small" 
    #etc. 
0

Tks for all answers。它確實幫了我很多!轉過這個函數之後,我想出了嵌套函數的方法。它將整個數據幀作爲對象(x):

def func(x,y): 
if (x<=3)&(y<=3): 
    return 'small' 
else: 
    return'big' 

data['c']=data.apply(lambda x:func(x['a'],x['b']),axis=1) 
+0

你完全誤解'apply'。這個答案和我的第一個答案一樣,只有更多的代碼。閱讀文檔 –