在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 list 合并连接字符串的方法
Mar 09 Python
RC4文件加密的python实现方法
Jun 30 Python
深入理解Python中命名空间的查找规则LEGB
Aug 06 Python
Python三级菜单的实例
Sep 13 Python
Python贪心算法实例小结
Apr 22 Python
Python爬虫之正则表达式基本用法实例分析
Aug 08 Python
python实现随机漫步算法
Aug 27 Python
python 画三维图像 曲面图和散点图的示例
Dec 29 Python
Python3最长回文子串算法示例
Mar 04 Python
python线程定时器Timer实现原理解析
Nov 30 Python
python爬虫使用正则爬取网站的实现
Aug 03 Python
怎么用Python识别手势数字
Jun 07 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
基于mysql的bbs设计(五)
2006/10/09 PHP
php数组中删除元素的实现代码
2012/06/22 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
jquery tools系列 expose 学习
2009/09/06 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件。
2011/12/26 Javascript
原生js写的放大镜效果
2012/08/22 Javascript
javascript中input中readonly和disabled区别介绍
2012/10/23 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
jquery使用经验小结
2015/05/20 Javascript
JavaScript中的acos()方法使用详解
2015/06/14 Javascript
js实现返回顶部效果
2017/03/10 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
在一个页面实现两个zTree联动的方法
2017/12/20 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
深入分析JavaScript 事件循环(Event Loop)
2020/06/19 Javascript
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
numpy返回array中元素的index方法
2018/06/27 Python
python3学生名片管理v2.0版
2018/11/29 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
Django与pyecharts结合的实例代码
2020/05/13 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
Python如何实现后端自定义认证并实现多条件登陆
2020/06/22 Python
Python无损压缩图片的示例代码
2020/08/06 Python
python Timer 类使用介绍
2020/12/28 Python
CSS3 边框效果
2019/11/04 HTML / CSS
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
美国最大的宠物药店:1-800-PetMeds
2016/10/02 全球购物
软件配置管理有什么好处
2015/04/15 面试题
优秀大学生自荐信
2014/06/09 职场文书
2014入党积极分子批评与自我批评思想汇报
2014/09/20 职场文书
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL