【问题标题】:understanding lambda functions in pandas了解 pandas 中的 lambda 函数
【发布时间】:2018-03-02 12:58:51
【问题描述】:

我正在尝试解决 Python 课程的问题,发现有人在 github 中实现了相同问题的解决方案。我只是想了解github中给出的解决方案。

我有一个名为 Top15 的熊猫数据框,其中包含 15 个国家/地区,数据框中的一列是“HighRenew”。此列存储每个国家/地区使用的可再生能源百分比。我的任务是将“HighRenew”列中的列值转换为布尔数据类型。

如果特定国家/地区的值高于所有 15 个国家/地区的可再生能源百分比中值,则我应将其编码为 1,否则应编码为 0。“HighRenew”列从数据框中切出为系列,复制如下。

Country
China                  True
United States         False
Japan                 False
United Kingdom        False
Russian Federation     True
Canada                 True
Germany                True
India                 False
France                 True
South Korea           False
Italy                  True
Spain                  True
Iran                  False
Australia             False
Brazil                 True
Name: HighRenew, dtype: bool

github解决方案分3个步骤实现,前2个我理解,但不知道最后一个使用了lambda函数。有人可以解释这个 lambda 函数是如何工作的吗?

median_value = Top15['% Renewable'].median()
Top15['HighRenew'] = Top15['% Renewable']>=median_value
Top15['HighRenew'] = Top15['HighRenew'].apply(lambda x:1 if x else 0)

【问题讨论】:

    标签: python pandas lambda


    【解决方案1】:

    lambda 表示匿名(即未命名)函数。如果它与pd.Series.apply 一起使用,则将系列的每个元素都输入lambda 函数。结果将是另一个pd.Series,每个元素都通过lambda

    apply + lambda 只是一个隐蔽的循环。您应该尽可能使用矢量化功能。 @jezrael 提供了这样的vectorised solution

    给定列表lst,下面是普通python中的等价物。这里lst 的每个元素都通过lambda 函数传递并聚合在一个列表中。

    list(map(lambda x: 1 if x else 0, lst))
    

    使用if x 而不是if x == True 来测试“Truthy”值是一种Pythonic 习惯用法,有关True 的更多信息,请参阅this answer

    【讨论】:

      【解决方案2】:

      我认为apply 是底层循环,最好使用矢量化astype - 它将True 转换为1False 转换为0

      Top15['HighRenew'] = (Top15['% Renewable']>=median_value).astype(int)
      

      lambda x:1 if x else 0
      

      表示带有条件的匿名函数(lambda 函数) - if True return 1 else return 0

      有关lambda功能的更多信息请查看this answers

      【讨论】:

      • 所以,在这个解决方案中,lambda x:1 if x else 0 lambda 函数会考虑系列中的每个值,并给出一个
      • @jezrael 是的,我试过了,我得到了这个值 [1 1 0] ,这意味着 lambda 函数将空字符串 ' ' 视为 True,根据它不应该被视为 False到这个 [链接] (stackoverflow.com/questions/20420934/…) ?
      • @thileepan - 尝试区别 ''""- 空字符串和 ' ''""' - 不为空 - 首先是因为空格,其次是因为 ""
      • 是的,我的错。我的意思是非空字符串' ',因为非空版本有一些价值,而空的'' 没有价值。
      • @BrandonBarney 你是完全正确的,' ' 是非空的,因此是 True,'' 是空的,因此是 False。
      【解决方案3】:

      不要使用解决方法或 lambda,只需使用 Panda 的内置功能即可解决此问题。这种方法称为掩码,本质上我们使用比较器针对Series(df 的列)来获取布尔值:

      import pandas as pd
      import numpy as np
      
      foo = [{
          'Country': 'Germany',
          'Percent Renew': 100
      }, {
          'Country': 'Germany',
          'Percent Renew': 75
      }, {
          'Country': 'China',
          'Percent Renew': 25
      }, {
          'Country': 'USA',
          'Percent Renew': 5
      }]
      
      df = pd.DataFrame(foo, index=pd.RangeIndex(0, len(foo)))
      
      df
      
      #| Country   | Percent Renew |
      #| Germany   | 100           |
      #| Australia | 75            |
      #| China     | 25            |
      #| USA       | 5             |
      
      np.mean(df['Percent Renew'])
      # 51.25
      
      df['Better Than Average'] = df['Percent Renew'] > np.mean(df['Percent Renew'])
      
      #| Country   | Percent Renew | Better Than Average |
      #| Germany   | 100           | True
      #| Australia | 75            | True
      #| China     | 25            | False
      #| USA       | 5             | False
      

      我之所以提出这个优于其他解决方案的具体原因是掩蔽也可以用于许多其他目的。我不会在这里深入讨论,但是一旦您了解到 pandas 支持这种功能,在 pandas 中执行其他数据操作就会变得容易得多。

      编辑: 我读到需要 boolean 数据类型需要 True False 而不是需要编码版本 10 在这种情况下是 astype建议将充分地将布尔值转换为整数值。不过,出于屏蔽目的,切片需要“真”“假”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-08
        • 2016-07-23
        • 1970-01-01
        相关资源
        最近更新 更多