在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用于url解码和中文解析的小脚本(python url decoder)
Aug 11 Python
用Python遍历C盘dll文件的方法
May 06 Python
简单谈谈Python中的闭包
Nov 30 Python
Python及Django框架生成二维码的方法分析
Jan 31 Python
Python实现繁体中文与简体中文相互转换的方法示例
Dec 18 Python
Python逐行读取文件中内容的简单方法
Feb 26 Python
Python3实现的判断环形链表算法示例
Mar 07 Python
详解Python中的测试工具
Jun 09 Python
python画图--输出指定像素点的颜色值方法
Jul 03 Python
python中自带的三个装饰器的实现
Nov 08 Python
3种python调用其他脚本的方法
Jan 06 Python
让文件路径提取变得更简单的Python Path库
May 27 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
2021年最新CPU天梯图
2021/03/04 数码科技
浅谈PHP 闭包特性在实际应用中的问题
2009/10/30 PHP
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
广告显示判断
2006/08/31 Javascript
Javascript实例教程(19) 使用HoTMetal(4)
2006/12/23 Javascript
javascript options属性集合操作代码
2009/12/28 Javascript
js 获取后台的字段 改变 checkbox的被选中的状态 代码
2013/06/05 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
jQuery实现非常实用漂亮的select下拉菜单选择效果
2015/11/06 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
2017/07/21 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
python实现获取客户机上指定文件并传输到服务器的方法
2015/03/16 Python
django静态文件加载的方法
2018/05/20 Python
如何利用Anaconda配置简单的Python环境
2019/06/24 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
String s = new String(“xyz”);创建了几个String Object?
2015/08/05 面试题
党课心得体会范文
2014/09/09 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript