在pandas中遍历DataFrame行的实现方法


Posted in Python onOctober 23, 2019

有如下 Pandas DataFrame:

import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp)
print df

上面代码输出:

   c1   c2
0  10  100
1  11  110
2  12  120

现在需要遍历上面DataFrame的行。对于每一行,都希望能够通过列名访问对应的元素(单元格中的值)。也就是说,需要类似如下的功能:

for row in df.rows:
 print row['c1'], row['c2']

Pandas 可以这样做吗?

我找到了similar question。但这并不能给我需要的答案,里面提到:

for date, row in df.T.iteritems():

要么

for row in df.iterrows():

但是我不明白row对象是什么,以及我如何使用它。

最佳解决方案

要以 Pandas 的方式迭代遍历DataFrame的行,可以使用:

DataFrame.iterrows()

for index, row in df.iterrows():
 print row["c1"], row["c2"]

DataFrame.itertuples()

for row in df.itertuples(index=True, name='Pandas'):
 print getattr(row, "c1"), getattr(row, "c2")

itertuples()应该比iterrows()快

但请注意,根据文档(目前 Pandas 0.19.1):

  • iterrows:数据的dtype可能不是按行匹配的,因为iterrows返回一个系列的每一行,它不会保留行的dtypes(dtypes跨DataFrames列保留)*
  • iterrows:不要修改行

你不应该修改你正在迭代的东西。这不能保证在所有情况下都能正常工作。根据数据类型的不同,迭代器返回一个副本而不是一个视图,写入它将不起作用。

改用DataFrame.apply():

new_df = df.apply(lambda x: x * 2)
itertuples:列名称将被重命名为位置名称,如果它们是无效的Python标识符,重复或以下划线开头。对于大量的列(> 255),返回常规元组。

第二种方案: apply

您也可以使用df.apply()遍历行并访问函数的多个列。

docs: DataFrame.apply()

def valuation_formula(x, y):
 return x * y * 0.5
 
df['price'] = df.apply(lambda row: valuation_formula(row['x'], row['y']), axis=1)

第三种方案:iloc

您可以使用df.iloc函数,如下所示:

for i in range(0, len(df)):
 print df.iloc[i]['c1'], df.iloc[i]['c2']

第四种方案:略麻烦,但是更高效,将DataFrame转为List

您可以编写自己的实现namedtuple的迭代器

from collections import namedtuple
 
def myiter(d, cols=None):
 if cols is None:
  v = d.values.tolist()
  cols = d.columns.values.tolist()
 else:
  j = [d.columns.get_loc(c) for c in cols]
  v = d.values[:, j].tolist()
 
 n = namedtuple('MyTuple', cols)
 
 for line in iter(v):
  yield n(*line)

这相当于pd.DataFrame.itertuples,但是效率更高。

将自定义函数用于给定的DataFrame:

list(myiter(df))
 
[MyTuple(c1=10, c2=100), MyTuple(c1=11, c2=110), MyTuple(c1=12, c2=120)]

或与pd.DataFrame.itertuples:

list(df.itertuples(index=False))
 
[Pandas(c1=10, c2=100), Pandas(c1=11, c2=110), Pandas(c1=12, c2=120)]

全面的测试

我们测试了所有可用列:

def iterfullA(d):
 return list(myiter(d))
 
def iterfullB(d):
 return list(d.itertuples(index=False))
 
def itersubA(d):
 return list(myiter(d, ['col3', 'col4', 'col5', 'col6', 'col7']))
 
def itersubB(d):
 return list(d[['col3', 'col4', 'col5', 'col6', 'col7']].itertuples(index=False))
 
res = pd.DataFrame(
 index=[10, 30, 100, 300, 1000, 3000, 10000, 30000],
 columns='iterfullA iterfullB itersubA itersubB'.split(),
 dtype=float
)
 
for i in res.index:
 d = pd.DataFrame(np.random.randint(10, size=(i, 10))).add_prefix('col')
 for j in res.columns:
  stmt = '{}(d)'.format(j)
  setp = 'from __main__ import d, {}'.format(j)
  res.at[i, j] = timeit(stmt, setp, number=100)
 
res.groupby(res.columns.str[4:-1], axis=1).plot(loglog=True);

在pandas中遍历DataFrame行的实现方法

在pandas中遍历DataFrame行的实现方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 深入理解yield
Sep 06 Python
python中管道用法入门实例
Jun 04 Python
Python实现一个简单的验证码程序
Nov 03 Python
用Python中的turtle模块画图两只小羊方法
Apr 09 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
Django Rest framework三种分页方式详解
Jul 26 Python
使用Python实现图像标记点的坐标输出功能
Aug 14 Python
快速查找Python安装路径方法
Feb 06 Python
Python实现初始化不同的变量类型为空值
Jun 02 Python
Python实现冒泡排序算法的完整实例
Nov 04 Python
如何通过Python实现RabbitMQ延迟队列
Nov 28 Python
Pandas数据结构之Series的使用
Mar 31 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
Oct 23 #Python
Pandas DataFrame中的tuple元素遍历的实现
Oct 23 #Python
10行Python代码计算汽车数量的实现方法
Oct 23 #Python
在OpenCV里使用特征匹配和单映射变换的代码详解
Oct 23 #Python
手把手教你Python yLab的绘制折线图的画法
Oct 23 #Python
Python之Numpy的超实用基础详细教程
Oct 23 #Python
Python从列表推导到zip()函数的5种技巧总结
Oct 23 #Python
You might like
《PHP边学边教》(02.Apache+PHP环境配置――上篇)
2006/12/13 PHP
PHP 简易输出CSV表格文件的方法详解
2013/06/20 PHP
PHP中if和or运行效率对比
2014/12/12 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
JSON 学习之完全手册 图文
2007/05/29 Javascript
extjs DataReader、JsonReader、XmlReader的构造方法
2009/11/07 Javascript
基于jQuery实现简单的折叠菜单效果
2015/11/23 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
2015/12/03 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
Servlet实现文件上传,可多文件上传示例
2016/12/05 Javascript
深入理解Commonjs规范及Node模块实现
2017/05/17 Javascript
详解angularjs 学习之 scope作用域
2018/01/15 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
jQuery each和js forEach用法比较
2019/02/27 jQuery
element-ui上传一张图片后隐藏上传按钮功能
2019/05/22 Javascript
[02:58]献给西雅图的情书_高清
2014/05/29 DOTA
Python程序设计入门(5)类的使用简介
2014/06/16 Python
Python实现各种排序算法的代码示例总结
2015/12/11 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
2017/10/20 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
pandas object格式转float64格式的方法
2018/04/10 Python
Python3 max()函数基础用法
2019/02/19 Python
python并发编程多进程 模拟抢票实现过程
2019/08/20 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
如何在python中实现线性回归
2020/08/10 Python
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
英国排名第一的宠物店:PetPlanet
2020/02/02 全球购物
大学生自荐信
2013/12/11 职场文书
优秀管理者获奖感言
2014/02/17 职场文书
优秀家长事迹材料
2014/05/17 职场文书
python如何利用cv2模块读取显示保存图片
2021/06/04 Python