2017-01-02 62 views
2

多個變量的λ我有一個系列,如如下:Python的大熊貓LAMBDA:使用內數據幀

example = pd.Series([[1.0, 1209.75, 1207.25], 
[1.0, 1211.0, 1207.5], 
[-1.0, 1211.25, 1205.75], 
[0, 1207.25, 1206.0], 
[1.0, 1206.25, 1201.0], 
[-1.0, 1205.75, 1202.75], 
[0, 1205.5, 1203.75]]) 

這個系列基本上在每個單元3號的列表。 我把它變成一個數據幀,並添加一個新列:

example = example.to_frame(name="input") 
example["result"]=np.NaN 

現在我想在它執行以下操作:

example["result"] = example["input"].apply(lambda x,y,z: y if x==1 else z if x==-1 else NaN) 

試圖做到這一點時,我收到以下錯誤信息: missing 2 required positional arguments: 'y' and 'z'

回答

2

lambda只有一個參數,在本例中是一個列表。只要指數名單:

>>> example["result"] = example["input"].apply(lambda lst: lst[1] if lst[0]==1 else lst[2] if lst[0]==-1 else np.NaN) 
>>> example 
         input result 
0 [1.0, 1209.75, 1207.25] 1209.75 
1  [1.0, 1211.0, 1207.5] 1211.00 
2 [-1.0, 1211.25, 1205.75] 1205.75 
3  [0, 1207.25, 1206.0]  NaN 
4 [1.0, 1206.25, 1201.0] 1206.25 
5 [-1.0, 1205.75, 1202.75] 1202.75 
6  [0, 1205.5, 1203.75]  NaN 

開句玩笑,你可以重構嵌套三元運營商與嵌套IFS的功能,讓你的代碼更易讀:

def func(lst): 
    x, y, z = lst 
    if x == 1: 
     return y 
    elif x == -1: 
     return z 
    else: 
     return np.NaN 


example["result"] = example["input"].apply(func) 
+0

是的,我剛剛發現它......對不起,夥計們。但有趣的是,經常用我的問題來說足以讓我找到答案......無論如何,謝謝! 你的意見是什麼意思?你的建議是什麼? –

+0

@jimbasquiat查看最新的答案。 –

+0

非常感謝。在函數的情況下,爲什麼我們使用x,y,z而不是x [0],x [1],x [2]和lambda中的一樣?函數和lambda不應該是等價的嗎? –

0

這裏是一個矢量化解決方案:

In [30]: example 
Out[30]: 
         input 
0 [1.0, 1209.75, 1207.25] 
1  [1.0, 1211.0, 1207.5] 
2 [-1.0, 1211.25, 1205.75] 
3  [0, 1207.25, 1206.0] 
4 [1.0, 1206.25, 1201.0] 
5 [-1.0, 1205.75, 1202.75] 
6  [0, 1205.5, 1203.75] 

In [31]: example['result'] = np.where(np.isclose(example.input.str[0], 1), 
    ...:        example.input.str[1], 
    ...:        np.where(np.isclose(example.input.str[0], -1), 
    ...:          example.input.str[2], 
    ...:          np.nan)) 
    ...: 

In [32]: example 
Out[32]: 
         input result 
0 [1.0, 1209.75, 1207.25] 1209.75 
1  [1.0, 1211.0, 1207.5] 1211.00 
2 [-1.0, 1211.25, 1205.75] 1205.75 
3  [0, 1207.25, 1206.0]  NaN 
4 [1.0, 1206.25, 1201.0] 1206.25 
5 [-1.0, 1205.75, 1202.75] 1202.75 
6  [0, 1205.5, 1203.75]  NaN 
+0

這不處理'example.str [0]'是-1的情況 –

+0

@MaxU這很有趣,除了.isclose有點不幸 –

+0

@MosesKoledoye,謝謝你指出!我更正了我的回答 – MaxU