【问题标题】:How to .apply() lambda function to restricted column set in DataFrame如何将 .apply() lambda 函数应用于 DataFrame 中的受限列集
【发布时间】:2017-04-08 15:01:18
【问题描述】:

我正在尝试验证我创建的 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

【问题讨论】:

    标签: python pandas numpy dataframe lambda


    【解决方案1】:

    选择列子集进行处理是相当直接的。这里我使用与创建数据框相同的选择器,但它只是一个列名列表。

    代码:

    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
    

    【讨论】:

    • 拜托,不要做 list('bde'),那不是 Pythonic!
    • @DiegoMoraCespedes 正如我所说,这是 OP 使用的方法,我这样做是为了让上下文更加熟悉。很抱歉你觉得它冒犯了。
    【解决方案2】:

    您可以访问 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”列。

    【讨论】:

    • OP 声明 max_valuemin_value 仅用于调试。其余的答案是另一个已经存在的答案的副本。
    猜你喜欢
    • 2018-07-26
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 2016-04-29
    相关资源
    最近更新 更多