×

Part 2.4 pandas的Apply 函数和 Map函数

minsx minsx 发表于2021-10-12 00:00:00 浏览117 评论0

抢沙发发表评论

Applications of Deep Neural Networks with Keras

基于Keras的深度神经网络应用

著:Jeff Heaton  译:人工智能学术前沿

目录

1.Python基础

2.机器学习Python

3.TensorFlow简介

4.表格类数据的训练

5.正则化和Dropout

6.用于计算机视觉的卷积神经网络

7.生成对抗网络

8.Kaggle数据集

9.迁移学习

10.Keras的时间序列

11.自然语言处理与语音识别

12.强化学习

13.Advanced/Other Topics

14.其他神经网络技术


     2.4 Apply 函数和 Map函数

 Part 2.4: Apply and Map

如果你以前接触过大数据或函数式编程语言,你可能听说过map/reduce。Map和reduce是将创建的任务应用到数据帧(dataframe)的两个函数。Pandas支持函数式编程技术,允许您跨整个数据帧使用函数。除了您编写的函数外,Pandas还提供了几个用于数据帧的标准函数。

数据帧中Map函数的使用

Using Map with Dataframes

map函数允许您通过将列中的某些值映射到其他值来转换列。考虑Auto MPG数据集,其中包含一个字段origin_name,该字段包含一个介于1到3之间的值,该值指示每一辆汽车的地理来源。我们可以看到如何使用map函数将这个数字原点转换为每个原点的文本名称。
我们将开始加载自动MPG数据集。

import osimport pandas as pdimport numpy as np
df = pd.read_csv( "https://data.heatonresearch.com/data/t81-558/auto-mpg.csv", na_values=['NA', '?'])
pd.set_option('display.max_columns', 7)pd.set_option('display.max_rows', 5)
display(df)


Pandas中的map方法操作单个列。为map提供一个值字典,用于转换目标列。映射键指定目标列中的哪些值应该转换为这些键指定的值。下面的代码展示了map函数如何将1、2和3的数值转换为北美、欧洲和亚洲的字符串值。Pandas中的map方法操作单个列。为map提供一个值字典,用于转换目标列。映射键指定目标列中的哪些值应该转换为这些键指定的值。下面的代码展示了map函数如何将1、2和3的数值转换为北美、欧洲和亚洲的字符串值。

# Apply the mapdf['origin_name'] = df['origin'].map(    {1: 'North America', 2: 'Europe', 3: 'Asia'})
# Shuffle the data, so that we hopefully see# more regions.df = df.reindex(np.random.permutation(df.index))
# Displaypd.set_option('display.max_columns', 7)pd.set_option('display.max_rows', 10)display(df)

数据帧中Apply函数的使用

Using Apply with Dataframes

数据帧的apply函数可以在整个数据帧上运行一个函数。您可以使用传统的命名函数或lambda函数。Python将针对数据帧中的每一行或每一列执行所提供的函数。函数的轴参数指定是跨行或列运行的。对于axis = 1,使用行。下面的代码计算一个称为efficiency 的级数,它是displacement除以horsepower。

efficiency = df.apply(lambda x: x['displacement']/x['horsepower'], axis=1)display(efficiency[0:10])

输出

45     2.345455 

290    2.471831 

313    1.677778 

82     1.237113 

33     2.320000 

249    2.363636 

27     1.514286 

7      2.046512 

302    1.500000 

179    1.234694 

dtype: float64

现在,您可以将该系列插入到数据框架中,作为新列或替换现有列。下面的代码将这个新系列插入到数据帧中。

df['efficiency'] = efficiency


使用Apply和Map函数的特征工程

Feature Engineering with Apply and Map

在本节中,我们将看到如何使用map、apply和分组来计算复杂的特性。数据集为CSV格式:

https://www.irs.gov/pub/irs-soi/16zpallagi.csv


此URL包含美国政府“SOI税收统计-个人所得税统计”的公共数据。该网站的入口点在这里:

https://www.irs.gov/statistics/soi-tax-stats-individual-income-tax-statistics-2016-zip-code-data-soi


描述该数据的文档位于上面的链接。
对于这个特性,我们将尝试估计每个邮政编码的调整后总收入(AGI)。数据文件包含许多列;但是,您将只使用以下内容:

STATE - 国家(e.g., MO)

zipcode - 邮编 (e.g. 63017)

agi_stub - 年收入的六个不同等级 (1 through 6)

N1 - 每个agi_stub的纳税申报单的数量


注意,对于agi_stub括号中的每个邮政编码,该文件将有六行。您可以跳过邮政编码0或99999。
我们将用这些列创建一个输出CSV;但是,每个邮政编码只有一行。计算收入等级的加权平均值。例如,63017有以下6行:


我们必须把这六行合并成一行。出于隐私考虑,AGI被分成6个部分。我们需要将这些桶组合起来,并估计一个邮政编码的实际AGI。为此,考虑N1的值:

1 = 1 to 25,000

2 = 25,000 to 50,000

3 = 50,000 to 75,000

4 = 75,000 to 100,000

5 = 100,000 to 200,000

6 = 200,000 or more


这些范围的中位数约为:

1 = 12,500

2 = 37,500

3 = 62,500

4 = 87,500

5 = 112,500

6 = 212,500


使用这个你可以估计63017的平均AGI如下:


>>> totalCount = 4710 + 2780 + 2130 + 2010 + 5240 + 3510

 >>> totalAGI = 4710 * 12500 + 2780 * 37500 + 2130 * 62500     + 2010 * 87500 + 5240 * 112500 + 3510 * 212500 

>>> print(totalAGI / totalCount) 


 88689.89205103042


我们从读取政府数据开始。

import pandas as pd
df=pd.read_csv('https://www.irs.gov/pub/irs-soi/16zpallagi.csv')


首先,我们修剪所有邮政编码0或99999。我们还选择了我们需要的三个字段。

df=df.loc[(df['zipcode']!=0) & (df['zipcode']!=99999),          ['STATE','zipcode','agi_stub','N1']]
pd.set_option('display.max_columns', 0)pd.set_option('display.max_rows', 10)
display(df)


我们使用map函数将所有agi_stub值替换为正确的中值。

medians = {1:12500,2:37500,3:62500,4:87500,5:112500,6:212500}df['agi_stub']=df.agi_stub.map(medians)
pd.set_option('display.max_columns', 0)pd.set_option('display.max_rows', 10)display(df)


接下来,我们将数据帧按邮政编码分组。

groups = df.groupby(by='zipcode')

该程序应用一个lambda在组中应用,然后计算AGI估计。

df = pd.DataFrame(groups.apply(     lambda x:sum(x['N1']*x['agi_stub'])/sum(x['N1']))) \    .reset_index()
pd.set_option('display.max_columns', 0)pd.set_option('display.max_rows', 10)
display(df)


现在可以重命名新的agi_estimate列。

df.clumns = ['zipcode','agi_estimate']
pd.set_option('display.max_columns', 0)pd.set_option('display.max_rows', 10)
display(df)


最后,我们检查63017的邮政编码是否得到了正确的值。

df[ df['zipcode']==63017 ]

扫码关注我们

微信号 :AI_Frontiers

qq群:966308496

今日头条:人工智能学术前沿

知乎:人工智能学术前沿

米斯云

访客