理解pandas

时间:2018-03-02 12:58:51

标签: python 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)

3 个答案:

答案 0 :(得分:5)

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))

这是一个Pythonic成语来测试" Truthy"使用if x而非if x == True的值,请参阅this answer,了解有关True的更多信息。

答案 1 :(得分:2)

我认为apply是幕后的循环,更好的是使用矢量化astype - 它将True转换为1False转换为{{1} }:

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

表示具有条件的匿名函数(lambda x:1 if x else 0 函数) - 如果lambda返回True,则返回1

有关0功能检查this answers的详细信息。

答案 2 :(得分:0)

不要使用变通办法或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和{{1}在这种情况下,建议的0将布尔值充分转换为整数值。但是,为了掩盖目的,' True' '假'切片需要。