在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统计文本字符串里单词出现频率的方法
May 26 Python
Python有序字典简单实现方法示例
Sep 28 Python
基于数据归一化以及Python实现方式
Jul 11 Python
widows下安装pycurl并利用pycurl请求https地址的方法
Oct 15 Python
python统计中文字符数量的两种方法
Jan 31 Python
Python中注释(多行注释和单行注释)的用法实例
Aug 28 Python
python的列表List求均值和中位数实例
Mar 03 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
django序列化时使用外键的真实值操作
Jul 15 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
Sep 14 Python
Python实现JS解密并爬取某音漫客网站
Oct 23 Python
python实现简单区块链结构
Apr 25 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 在文件指定行插入数据的代码
2010/05/08 PHP
PHP 数组基础知识小结
2010/08/20 PHP
检查php文件中是否含有bom的函数
2012/05/31 PHP
探讨如何在php168_cms中提取验证码
2013/06/08 PHP
学习php过程中的一些注意点的总结
2013/10/25 PHP
简单解决新浪SAE无法上传文件的问题
2015/05/13 PHP
解读PHP中上传文件的处理问题
2016/05/29 PHP
php分页查询的简单实现代码
2017/03/14 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
laravel框架实现去掉URL中index.php的方法
2019/10/12 PHP
js实现同一页面可多次调用的图片幻灯切换效果
2015/02/28 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
2015/11/10 Javascript
js获取页面引用的css样式表中的属性值方法(推荐)
2016/08/19 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
小程序实现列表点赞功能
2018/11/02 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
[01:02:17]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG
2014/05/26 DOTA
Python创建系统目录的方法
2015/03/11 Python
Python实现数据库编程方法详解
2015/06/09 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
python 文件查找及内容匹配方法
2018/10/25 Python
python 图像平移和旋转的实例
2019/01/10 Python
pytorch实现线性拟合方式
2020/01/15 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
Django静态文件加载失败解决方案
2020/08/26 Python
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
AT&T Wireless:手机、无限数据计划和配件
2018/06/03 全球购物
组织关系转移介绍信
2014/01/16 职场文书
无财产无子女离婚协议书范文
2014/09/14 职场文书
2014年民警工作总结
2014/11/25 职场文书
2014年财务个人工作总结
2014/12/08 职场文书
2014年人大工作总结
2014/12/10 职场文书
委托书范本格式
2019/04/18 职场文书
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang