使用 pandas 处理数据时,遍历和并行处理是比较常见的操作了本文总结了几种不同样式的操作和并行处理方法。

1. 准备示例数据

import pandas as pd
import numpy as np df = pd.DataFrame(np.random.randint(40, 100, (5, 10)), columns=[f's{i}' for i in range(10)], index=['john', 'bob', 'mike', 'bill', 'lisa'])
df['is_passed'] = df.s9.map(lambda x: True if x > 60 else False)

df 输出:

      s0  s1  s2  s3  s4  s5  s6  s7  s8  s9  is_passed
john 56 70 85 91 92 80 63 81 45 57 False
bob 99 93 80 42 91 81 53 75 61 78 True
mike 76 92 76 80 57 98 94 79 87 94 True
bill 81 83 92 91 51 55 40 77 96 90 True
lisa 85 82 56 57 54 56 49 43 99 51 False

2. 遍历

pandas 中,共有三种遍历数据的方法,分别是:

2.1. iterrows

按行遍历,将 DataFrame 的每一行迭代为 (index, Series) 对,可以通过 row[name]row.name 对元素进行访问。

>>> for index, row in df.iterrows():
... print(row['s0']) # 也可使用 row.s0 56
99
76
81
85

2.2. itertuples

按行遍历,将 DataFrame 的每一行迭代为命名元祖,可以通过 row.name 对元素进行访问,比 iterrows 效率高。

>>> for row in df.itertuples():
... print(row.s0) 56
99
76
81
85

2.3. iteritems

按列遍历,将 DataFrame 的每一列迭代为 (列名, Series) 对,可以通过 row[index] 对元素进行访问。

>>> for index, row in df.iteritems():
... print(row[0]) 56
70
85
91
92
80
63
81
45
57
False

3. 并行处理

3.1. map 方法

类似 Python 内建的 map() 方法,pandas 中的 map() 方法将函数、字典索引或是一些需要接受单个输入值的特别的对象与对应的单个列的每一个元素建立联系并串行得到结果。map() 还有一个参数 na_action,类似 R 中的 na.action,取值为 None(默认) 或 ingore,用于控制遇到缺失值的处理方式,设置为 ingore 时串行运算过程中将忽略 Nan 值原样返回。

比如这里将 is_passed 列中的 True 换为 1False 换位 0,可以有下面几种实现方式:

3.1.1. 字典映射

>>> # 定义映射字典
... score_map = {True: 1, False: 0} >>> # 利用 map() 方法得到对应 mike 列的映射列
... df.is_passed.map(score_map) john 0
bob 1
mike 1
bill 1
lisa 0
Name: is_passed, dtype: int64

3.1.2. lambda 函数

>>> # 如同创建该列时的那样
... df.is_passed.map(lambda x: 1 if x else 0) john 0
bob 1
mike 1
bill 1
lisa 0
Name: is_passed, dtype: int64

3.1.3. 常规函数

>>> def bool_to_num(x):
... return 1 if x else 0 >>> df.is_passed.map(bool_to_num)

3.1.4. 特殊对象

一些接收单个输入值且有输出的对象也可以用map()方法来处理:

>>> df.is_passed.map('is passed: {}'.format)

john    is passed: False
bob is passed: True
mike is passed: True
bill is passed: True
lisa is passed: False
Name: is_passed, dtype: object

3.2. apply 方法

apply() 使用方式跟 map() 很像,主要传入的主要参数都是接受输入返回输出,但相较于 map() 针对单列 Series 进行处理,一条 apply() 语句可以对单列或多列进行运算,覆盖非常多的使用场景,下面分别介绍:

3.2.1. 单列数据

传入 lambda 函数:

df.is_passed.apply(lambda x: 1 if x else 0)

3.2.2. 输入多列数据

>>> def gen_describe(s9, is_passed):
... return f"s9's score is {s9}, so {'passed' if is_passed else 'failed'}" >>> df.apply(lambda r: gen_describe(r['s9'], r['is_passed']), axis=1) john s9's score is 57, so failed
bob s9's score is 78, so passed
mike s9's score is 94, so passed
bill s9's score is 90, so passed
lisa s9's score is 51, so failed
dtype: object

3.2.3. 输出多列数据

>>> df.apply(lambda row: (row['s9'], row['s8']), axis=1)

john    (57, 45)
bob (78, 61)
mike (94, 87)
bill (90, 96)
lisa (51, 99)
dtype: object

3.3. applymap 方法

applymap 是与 map 方法相对应的专属于 DataFrame 对象的方法,类似 map 方法传入函数、字典等,传入对应的输出结果,

不同的是 applymap 将传入的函数等作用于整个数据框中每一个位置的元素,比如将 df 中的所有小于 50 的全部改为 50

>>> def at_least_get_50(x):
... if isinstance(x, int) and x < 50:
... return 50
... return x >>> df.applymap(at_least_get_50) s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 is_passed
john 56 70 85 91 92 80 63 81 50 57 False
bob 99 93 80 50 91 81 53 75 61 78 True
mike 76 92 76 80 57 98 94 79 87 94 True
bill 81 83 92 91 51 55 50 77 96 90 True
lisa 85 82 56 57 54 56 50 50 99 51 False

附:结合 tqdm 给 apply 过程添加进度条

jupyter 中并行处理较大数据量的时候,往往执行后就只能干等着报错或者执行完了,使用 tqdm 可以查看数据实时处理进度,使用前需使用 pip install tqdm 安装该包。使用示例如下:

from tqdm import tqdm

def gen_describe(s9, is_passed):
return f"s9's score is {s9}, so {'passed' if is_passed else 'failed'}" #启动对紧跟着的 apply 过程的监视
tqdm.pandas(desc='apply')
df.progress_apply(lambda r: gen_describe(r['s9'], r['is_passed']), axis=1)

参考

  1. (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg

Pandas 中的遍历与并行处理的更多相关文章

  1. pandas中的遍历方式速度对比

    对一个20667行的xlsx文件进行遍历测试 import pandas as pd # 定义一个计算执行时间的函数作装饰器,传入参数为装饰的函数或方法 def print_execute_time( ...

  2. pandas中的分组技术

    目录 1  分组操作 1.1  按照列进行分组 1.2  按照字典进行分组 1.3  根据函数进行分组 1.4  按照list组合 1.5  按照索引级别进行分组 2  分组运算 2.1  agg 2 ...

  3. (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg

    *从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...

  4. pandas中的axis参数(看其他人的博客中产生的疑问点,用自己的话解析出来)

    axis有两个值:axis=0或者axis=1 看到很多资料都不太理解,把我个人理解说一下: 下面这张图,在很多资料中都看到了,我只能说先死记住 axis=0,代表跨行(注意看这张图的axis=0的箭 ...

  5. [LeetCode] Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树

    Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  6. [LeetCode] Binary Tree Inorder Traversal 二叉树的中序遍历

    Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...

  7. nyoj202_红黑树_中序遍历

    红黑树 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 什么是红黑树呢?顾名思义,跟枣树类似,红黑树是一种叶子是黑色果子是红色的树... 当然,这个是我说的... & ...

  8. DS实验题 Order 已知父节点和中序遍历求前、后序

    题目: 思路: 这题是比较典型的树的遍历问题,思路就是将中序遍历作为位置的判断依据,假设有个节点A和它的父亲Afa,那么如果A和Afa的顺序在中序遍历中是先A后Afa,则A是Afa的左儿子,否则是右儿 ...

  9. YTU 2346: 中序遍历二叉树

    原文链接:https://www.dreamwings.cn/ytu2346/2606.html 2346: 中序遍历二叉树 时间限制: 1 Sec  内存限制: 128 MB 提交: 12  解决: ...

随机推荐

  1. ping通网关 ping不通dns

    一.Request Timed Out 当Ping指定的对象时,出现“Request Timed Out”提示信息的频率非常高,这说明对方无法接受发送过来的数据.当然这种情况下,很可能就是网络出现了故 ...

  2. Java数据结构——树、二叉树的理论知识汇总

    通用树的理论知识 一.树的定义 由一个或多个(n>=0)节点组成的有限集合T,有且仅有一个节点称为根(root),当n>1时,其7余的节点为m(m>=0)个互不相交的有限集合T1,T ...

  3. 开源搜索引擎排名第一,Elasticsearch是如何做到的?

    一.引言 随着移动互联网.物联网.云计算等信息技术蓬勃发展,数据量呈爆炸式增长.如今我们可以轻易得从海量数据里找到想要的信息,离不开搜索引擎技术的帮助. ​ 作为开源搜索引擎领域排名第一的 Elast ...

  4. 我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。

    业务背景 首先,业务需求是这样的,从第三方电商平台拉取所有订单,然后保存到公司自己的数据库,需要判断是否有物流信息,如果有物流信息,还需要再进行上传. 而第三方接口返回的数据是 JSON 格式的,其中 ...

  5. 伪距定位算法(matlab版)

    在各种伪距定位算法中,最小二乘法是一种比较简单而广泛的方法,该算法可以分为以下几步: 1.准备数据与设置初始值 这里准备数据,主要是对于各颗可见卫星,收集到它们在同一时刻的伪距测量值,计算测量值的各项 ...

  6. vue、react等SPA应用页脚组件闪烁的解决办法

    大家好,我是木瓜太香.大家在开发单页应用的时候,经常会遇到这样的需求,头部和尾部两个组件是大多数组件公用的,而中间的内容区域则是单独存在的,而且一般内容组件逻辑会比较多,如果我们不停刷新页面可能会出现 ...

  7. 20190925-01安装redis 000 022

    1.将redis压缩包放入Linux系统有4种办法. 第一:如果安装了VMware Tools工具可以直接进行拖拽 第二:在windows中找到配置好的共享文件夹将redis压缩包放入其中,在Linu ...

  8. SpringBoot搭建环境

    选择文件新建一个项目 选择:Spring Initializr,其他配置不变,点击下一步 这里一般写包名和项目名,这里我就默认,直接点击下一步 这里选择:Web  --> Spring Web ...

  9. PHP的九个超全局变量

    1. 什么是超全局变量 PHP官网:超全局变量 超全局变量就是在全部作用域中始终可用的内置变量. 全局作用域.函数作用域都可以使用的PHP内置变量. 在函数或方法中无需执行 global $varia ...

  10. 单应用模式 - Layuiadmin单页版放入TP6.0的部署方案

    thinkphp6.0.3单应用模式.layuiadmin1.4.0单页版,不需要tp的视图驱动 1. 复制 src.start 两个文件夹 2. 粘贴到 thinkphp 的 public 目录下 ...