在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实现的希尔排序算法实例
Jul 01 Python
Python进程间通信之共享内存详解
Oct 30 Python
详解如何在Apache中运行Python WSGI应用
Jan 02 Python
打包python 加icon 去掉cmd黑窗口方法
Jun 24 Python
Djang的model创建的字段和参数详解
Jul 27 Python
PHP统计代码行数的小代码
Sep 19 Python
深入理解Tensorflow中的masking和padding
Feb 24 Python
Python+appium框架原生代码实现App自动化测试详解
Mar 06 Python
Python3爬虫关于代理池的维护详解
Jul 30 Python
用Python进行websocket接口测试
Oct 16 Python
python 动态渲染 mysql 配置文件的示例
Nov 20 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 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
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
PHP 提取图片img标记中的任意属性的简单实例
2013/12/10 PHP
php中的strpos使用示例
2014/02/27 PHP
php三种实现多线程类似的方法
2015/10/30 PHP
ThinkPHP5 的简单搭建和使用详解
2018/11/15 PHP
php实现登录页面的简单实例
2019/09/29 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
2019/10/12 PHP
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
基于JavaScript实现智能右键菜单
2016/03/02 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
2016/03/16 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
vue获取DOM元素并设置属性的两种实现方法
2017/09/30 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
Angular 作用域scope的具体使用
2017/12/11 Javascript
前端防止用户重复提交js实现代码示例
2018/09/07 Javascript
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
python调用OpenCV实现人脸识别功能
2018/05/25 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
python多个模块py文件的数据共享实例
2019/01/11 Python
Django基础知识 web框架的本质详解
2019/07/18 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
QT5 Designer 打不开的问题及解决方法
2020/08/20 Python
Python中lru_cache的使用和实现详解
2021/01/25 Python
python 数据类型强制转换的总结
2021/01/25 Python
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
英国性感内衣和睡衣品牌:Bluebella
2018/01/26 全球购物
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
建筑个人求职信范文
2014/01/25 职场文书
预备党员的自我评价
2014/03/12 职场文书
国旗下的讲话演讲稿
2014/05/08 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
写景作文评语集锦
2014/12/25 职场文书