如何将.apply()lambda函数设置为DataFrame中的受限列集

时间:2017-04-08 15:01:18

标签: python pandas numpy dataframe lambda

我正在尝试验证我创建的lambda函数是否正确,因此我添加了添加列(max_value,min_value,diff)以验证我的lambda函数的数值是否正确。

但是当我这样做时,我注意到在评估期间生成的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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以访问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函数应用于&#39;&#39;&#39; d&#39;并且&#39; e&#39;列。