了解pandas中的lambda函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了了解pandas中的lambda函数相关的知识,希望对你有一定的参考价值。
我正在尝试解决Python课程的问题,发现有人在github中为同一个问题实现了解决方案。我只是想了解github中给出的解决方案。
我有一个名为Top15的pandas数据框,有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)
我认为apply
是引擎盖下的循环,更好的是使用矢量化astype
- 它将True
转换为1
和False
转换为0
:
Top15['HighRenew'] = (Top15['% Renewable']>=median_value).astype(int)
lambda x:1 if x else 0
意味着匿名函数(lambda
函数)与条件 - 如果True
返回1
否则返回0
。
有关lambda
功能检查this answers的更多信息。
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成语,有关this answer的更多信息,请参阅True
。
而不是使用变通办法或lambdas,只需使用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
而不是需要编码版本1
和0
在这种情况下,提出的astype
将充分转换为布尔值到整数值。但是,为了屏蔽目的,切片需要'True''False'。
以上是关于了解pandas中的lambda函数的主要内容,如果未能解决你的问题,请参考以下文章
AWS lambda 中的 Pandas 给出了 numpy 错误