2017-04-08 769 views
1

我試圖驗證我創建的lambda函數是否正確,因此我添加了添加列(max_value,min_value,diff)來驗證我的數值lambda函數是正確的。如何將.apply()lambda函數應用於DataFrame中的受限列設置

但是當我這樣做時,我注意到在評估過程中產生的lambda表達式包含了這些新列,結果diff和lambda列是不正確的。

  • 如何限制.apply()函數列b, d, e
  • 或者,是否可以限制lambda函數? (不知道這是合乎邏輯的)

代碼:

import numpy as np 
from pandas import DataFrame 
frame = DataFrame(np.random.randn(4, 3), columns=list('bde'), 
        index=['Utah', 'Ohio', 'Texas', 'Oregon']) 
f = lambda x: x.max() - x.min() 
frame['max_value'] = np.max(frame, axis=1) 
frame['min_value'] = np.min(frame, axis=1) 
frame['diff'] = frame.max_value - frame.min_value 
frame['lambda'] = frame.apply(f, axis=1) 
frame 

結果:

Out[30]: 
       b   d   e max_value min_value  diff lambda 
Utah 0.382063 -1.026674 -2.706572 0.382063 -2.706572 3.088636 5.795208 
Ohio 1.718023 -0.446802 -0.345996 1.718023 -0.446802 2.164825 2.611627 
Texas 0.809239 -0.761325 -1.253476 0.809239 -1.253476 2.062715 3.316191 
Oregon -1.722270 0.438120 -0.619916 0.438120 -1.722270 2.160390 3.882659 

回答

0

這是相當直截了當地選擇要處理的列的子集。這裏我使用與創建數據框相同的選擇器,但它只是一個列名稱列表。

代碼:

df['lambda'] = df[list('bde')].apply(lambda x: x.max() - x.min(), axis=1) 

測試代碼:

import numpy as np 
from pandas import DataFrame 

df = DataFrame(np.random.randn(4, 3), columns=list('bde'), 
       index=['Utah', 'Ohio', 'Texas', 'Oregon']) 
df['max_value'] = np.max(df, axis=1) 
df['min_value'] = np.min(df, axis=1) 
df['diff'] = df.max_value - df.min_value 
df['lambda'] = df[list('bde')].apply(lambda x: x.max() - x.min(), axis=1) 
print(df) 

結果:

   b   d   e max_value min_value  diff lambda 
Utah -0.108325 -0.043782 -0.799588 -0.043782 -0.799588 0.755807 0.755807 
Ohio 0.444546 -0.697631 1.226530 1.226530 -0.697631 1.924161 1.924161 
Texas -2.024484 -1.749634 2.110496 2.110496 -2.024484 4.134980 4.134980 
Oregon -0.482084 -0.604144 0.701907 0.701907 -0.604144 1.306051 1.306051 
+0

請不要做名單('bde'),那不是Pythonic! –

+0

@DiegoMoraCespedes正如我所說的,這是OP使用的方法,而且我這樣做是爲了讓上下文更加熟悉。對不起,你覺得它很冒犯。 –

0

您可以訪問在列Side的lambda函數:

f = lambda x: x['max_value'] - x['min_value'] 

如果你不想使用這些列,你可以做你的lambda函數內部的一切:

frame['lambda'] = frame[['b', 'd', 'e']].apply(lambda x: x.max() - x.min(), axis=1) 

這將適用lambda函數只對「B ','d'和'e'列。

+0

OP聲明'max_value'和'min_value'只用於調試。答案的其餘部分是另一個已經存在的答案的副本。 –