查看原文
其他

数据治理 | 数据分析与清洗工具:Pandas 创建新字段( 赠送本文同款数据!)

社科研究数据治理 数据Seminar 2022-12-31

目录

一、前言

二、如何创建新字段

  1. 直接运算法
  2. 使用 Python 函数或匿名函数
    (1)使用 Python 函数
    (2)使用匿名函数
  3. 使用映射关系或自定义方法
   (1)使用映射关系
   (2)使用自定义方法

三、总结

----------------------------------------

📜本文共4645字,预计阅读时间12分钟,感谢阅读!


💡 本文所用数据为:【数字经济专题数据库接受投资区域分布统计数据.xlsx】

💡 数据获取方式:关注本公众号,后台回复关键词“20220408”即可获取

Part1前言

上期文章中,我们介绍了数据类型错误带来的影响,同时也介绍了转换字段数据类型的方法。使用类型转换方法可以在基本的数据类型之间进行合理的转换。学习这些之后,我们就可以灵活地转换数据的类型,避免类型错乱带来的麻烦。本期文章将会继续学习 Pandas,学习如何使用已有的数据字段生成新的数据字段,或者根据需求修改数据字段内容。读完本文后,我们可以根据已有的字生成新的字段,得到更有价值的数据。
本文中所有 Python 代码均在集成开发环境 Visual Studio Code (VScode) 中使用交互式开发环境 Jupyter Notebook 编写。

Part2如何创建新字段

创建新字段一般是根据数据中已有的其他字段,通过某种运算方式得到新的字段。如下图所示:
上表中字段 1字段 2 的数据通过某种运算得到字段 3字段 3 就是由 字段 1字段 2衍生而来的。不难看出,上图中 “某种运算” 实际上就是数字的加法运算。在我们常用的 Excel 中,可以通过使用运算公式和自动填充和来实现这种功能,如下图所示:

那么在 Python 中,我们如何完成类似的操作呢?一般情况下,根据运算规则的难易或复杂程度可以使用以下三种方式来创建新的字段:

方式

描述

特点

直接运算法

可以通过简单 +、-、×、÷、>、<、取余数等等数学计算方法来生成新的字段。

使用方法简单易懂;仅数字型数据之间支持 -、×、÷等稍复杂的运算,字符型数据之间仅支持加法(字符串拼接)运算。

使用 Python 函数或匿名函数

通过使用 Python 自带的函数或者匿名函数配合 Pandas 中的apply() 函数,根据已有字段来生成新的字段。

可以调用 Python 的函数和匿名函数,支持简单的条件判断;多用于使用一个字段生成另一个字段的场景。

使用自定义方法或映射关系

通过使用 Pandas 中的 map()apply() 等方法配合用户自己定义的方法,自由地根据已有字段生成出新的字段。

可以调用用户的自定义方法或者某种映射关系;支持使用更复杂的条件判断和运算;支持 m 对 n 的关系,表示使用 m 个 字段生成 n 个字段(m,n都是大于1的正整数)。

不论使用以上三种方法哪一种,本质上都是使用某种运算方法来得到新的数据,但是这个方法需要需要满足一个条件,那就是参与运算的数据字段其中的所有数据都可以正常地参与你的运算方法并得到结果。假设我们需要使用某班级学生成绩表中的语文分数与数学成绩相加得到总成绩,那么当一位同学的语文成绩为 “缺考”,数学成绩为 80, “缺考”+80 显然是无法计算的,此时程序就会报错。所以生成新字段时需要考虑所有数据的格式和内容,下面我们分别来介绍以上的三种字段生成方法。

1直接运算法

我们使用本期文章赠送的数据【数字经济专题数据库接受投资区域分布统计数据.xlsx】来演示如何生成新的数据字段,先使用 Pandas 读取数据。
# 指定参数 nrows=31,表示仅读取前 31 行数据(该数据前 31 行数据为有效数据)
data = pd.read_excel('数字经济专题数据库接受投资区域分布统计数据.xlsx', nrows=31)

# 输出查看前 9 行数据
data.head(9)
  

场景 1:使用接受投资笔数减去接受风险投资笔数得到新字段接受非风险投资笔数

类似这种简单运算来生成字段的方法非常简单,直接使用两个字段做运算即可,实现代码如下:
# 直接使用字段做减法即可
data['接受非风险投资笔数'] = data['接受投资笔数'] - data['接受风险投资笔数']
data.head(9)
   
这种直接运算的方式非常简单,同时它的局限性也很大,例如所有数据都必须是可计算的,不能出现空值等影响正常计算的数据

2使用 Python 函数或匿名函数

无论是使用 Python 的内置函数还是使用匿名函数,都需要借助 Pandas 中的 apply()方法,我们即可以使用一个字段(Series 类型数据)调用这个方法,也可以使用多个字段(DataFrame 类型)调用这个方法;apply() 需要接收一个 func 参数,该参数必须是一个函数,该函数可以是 Python 内置函数或调用函数、匿名函数或以及自定义函数(这里我们先介绍前面两种)。这个函数会将调用它的数据当做是传入的参数,并返回该函数的运算结果。下面我们将举例图解这个过程。

(1)使用 Python 函数

场景 2: 得到省份字段中每个数据值的数据类型,保存到类型字段中。

# 先把刚才得到的 “接受非风险投资笔数” 字段删除
data.drop('接受非风险投资笔数', axis=1, inplace=True)

# 生成“类型”字段
data['类型'] = data['省份'].apply(type)
data.head(9)
   
观察上面的代码 data['省份'].apply(type),调用 apply() 的是 data['省份'],这是一个 Series 对象。而 apply() 中的 func 参数是 type(),我们知道,type() 的作用是返回传入对象的类型。所以代码 data['类型'] = data['省份'].apply(type) 的工作原理如下图所示:

(2)使用匿名函数

当需要做略微复杂一些的字段生成操作时,可以使用 Python 匿名函数来完成。

场景 3:生成投资量字段,当接收投资笔数大于等于 10000 时记为大量,否则记为少量。

# 先把刚才得到的 “类型” 字段删除
data.drop('类型', axis=1, inplace=True)

# 生成“投资量”字段
data['投资量'] = data['接受投资笔数'].apply(lambda M: '大量' if M >= 10000 else '少量')
data.head(9)
   

3使用映射关系或自定义方法

(1)使用映射关系

使用映射关系需要使用 Pandas 中的 map() 函数,可以将原始数据映射为用户设定的数据值。

场景 4:根据省份字段得到省份简称字段。

# 先把刚才得到的 “投资量” 字段删除
data.drop('投资量', axis=1, inplace=True)
# 定义映射关系,类型为字典
relationship = {'北京市':'京',
                '天津市':'津',
                '上海市':'沪',
                '重庆市':'渝',
                '河北省':'冀',
                '山西省':'晋',
                '内蒙古自治区':'内蒙古',
                '辽宁省':'辽',
                '吉林省':'吉',
                '黑龙江省':'黑'}
# 使用上面定义的映射关系得到 “省份简称” 字段
data['省份简称'] = data['省份'].map(relationship)
data
   

(2)使用自定义方法

使用自定义方法来创建字段时,我们需要提前定义好生成新字段的方法。同时需要设置 apply() 的参数 axis=1,表示沿着横轴运算。

场景 5:生成非风险投资所占百分比字段;要求保留三位小数。

# 先把刚才得到的 “省份简称” 字段删除
data.drop('省份简称', axis=1, inplace=True)

# 定义计算目标数据的方法
def get_rate(df):
    # 先定义需要使用的字段
    venture = df['接受风险投资笔数']
    investment_num = df['接受投资笔数']
    # 计算得到非风险投资数量
    not_venture = investment_num - venture
    # 计算非风险投资的占比
    rate = not_venture / investment_num
    # 保留三位小数
    rate_3 = round(rate, 3)
    # 转为字符型后加上百分号
    RATE =  str(rate_3) + '%'
    # 将所得结果返回
    return RATE

# 将上面的自定义方法传入 apply()
data['非风险投资占比'] = data.apply(get_rate, axis=1)
data.head(9)
   

使用自定义方法可以处理更为复杂的字段生成需求,当需要使用多个字段得到其他字段时,一般需要使用整个 DataFrame 调用 apply() 并设置参数 axis=1。原理如下图所示:

Part3总结

本期文章介绍了数据字段生成的方法,对于数据使用者来说,这项技能是必备的,学会这些我们可以从已有的数据中提取其他有用的信息。其中 apply() 的应用更是千变万化,这正是 Pandas 对比 Excel 的优势所在。



向下滑动查看更多

我们将在数据治理板块中推出一系列原创推文,帮助读者搭建一个完整的社科研究数据治理软硬件体系。该板块将涉及以下几个模块:

1. 计算机基础知识

(1) 社科研究软硬件体系搭建——虚拟化技术概述与实践

2. 编程基础

(1) 数据治理 | 带你学Python之 环境搭建与基础数据类型介绍篇

(2) 数据治理 | 带你学Python之控制结构与函数

(3) 数据治理 | 带你学Python之面向对象编程基础

(4) 数据治理 | 还在用Excel做数据分析呢?SQL它不香吗

(5) 数据治理 | 普通社科人如何学习SQL?一篇文章给您说明白

(6) 数据治理 |  如何实现SQL数据库的横向匹配

3. 数据采集

(1) 数据治理 | 快速get数据采集技能:理论知识篇

(2) 数据治理 | 数据采集实战:静态网页数据采集

(3) 数据治理 | 数据采集实战:动态网页数据采集

4. 数据存储

(1) 安装篇:数据治理 | 遇到海量数据stata卡死怎么办?这一数据处理利器要掌握

(2) 管理篇: 数据治理 | 多人协同处理数据担心不安全?学会这一招,轻松管理你的数据团队

(3) 数据导入:数据治理 | “把大象装进冰箱的第二步”:海量微观数据如何“塞进”数据库?

(4) 数据治理|Stata如何直连关系型数据库

5. 数据清洗

(1) 数据治理 | 数据清洗必备 — 正则表达式

(2) 数据治理 | 数据分析与清洗工具:Pandas基础

(3) 数据治理 | 数据分析与清洗工具:Pandas数据选取与修改

(4) 数据治理 | 数据分析与清洗工具:用Pandas快速选出你的“心之所向”

(5) 数据治理 | 数据分析与清洗工具:Pandas缺失值与重复值处理

(6) 数据治理 | 数据分析与清洗工具:Pandas 数据类型转换(赠送本文同款数据!!)

(7)本期内容:数据治理 | 数据分析与清洗工具:Pandas 创建新字段(赠送本文同款数据!)

6. 数据实验室搭建







数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


文 | 《社科领域大数据治理实务手册》


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存