在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中的自省(反射)详解
Jun 02 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
Dec 31 Python
python模拟Django框架实例
May 17 Python
浅谈Python生成器generator之next和send的运行流程(详解)
May 08 Python
Python实现的单向循环链表功能示例
Nov 10 Python
python中的闭包函数
Feb 09 Python
Python使用post及get方式提交数据的实例
Jan 24 Python
Python基于requests库爬取网站信息
Mar 02 Python
python实现ssh及sftp功能(实例代码)
Mar 16 Python
django实现更改数据库某个字段以及字段段内数据
Mar 31 Python
Python 通过监听端口实现唯一脚本运行方式
May 05 Python
keras和tensorflow使用fit_generator 批次训练操作
Jul 03 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
修改Zend引擎实现PHP源码加密的原理及实践
2008/04/14 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
2013/04/25 PHP
国外十大最流行的PHP框架排名
2013/07/04 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
2014/06/13 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
PHP调用接口API封装的例子
2019/10/11 PHP
PHP获取类私有属性的3种方法
2020/09/10 PHP
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
js动态加载以及确定加载完成的代码
2011/07/31 Javascript
JS实现的另类手风琴效果网页内容切换代码
2015/09/08 Javascript
你有必要知道的25个JavaScript面试题
2015/12/29 Javascript
AngularJS入门教程之更多模板详解
2016/08/19 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
Python新手入门最容易犯的错误总结
2017/04/24 Python
Python自定义线程类简单示例
2018/03/23 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
python 自动重连wifi windows的方法
2018/12/18 Python
关于python3中setup.py小概念解析
2019/08/22 Python
python类中super() 的使用解析
2019/12/19 Python
tensorflow 实现数据类型转换
2020/02/17 Python
制冷与电控专业应届生求职信
2013/11/11 职场文书
阿德的梦教学反思
2014/02/06 职场文书
财务信息服务专业自荐书范文
2014/02/08 职场文书
内勤主管岗位职责
2014/04/03 职场文书
服装仓管员岗位职责
2014/06/17 职场文书
2014年医药代表工作总结
2014/11/22 职场文书
道德模范事迹材料
2014/12/20 职场文书
安全保证书
2015/01/16 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
幼儿园教师读书笔记
2015/06/29 职场文书
2016春节放假通知范文
2015/08/18 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python