在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 从远程服务器下载日志文件的程序
Feb 10 Python
Python进程通信之匿名管道实例讲解
Apr 11 Python
基于hashlib模块--加密(详解)
Jun 21 Python
使用anaconda的pip安装第三方python包的操作步骤
Jun 11 Python
python统计多维数组的行数和列数实例
Jun 23 Python
python使用正则表达式来获取文件名的前缀方法
Oct 21 Python
python调用c++ ctype list传数组或者返回数组的方法
Feb 13 Python
Python networkx包的实现
Feb 14 Python
Python sqlite3查询操作过程解析
Feb 20 Python
Matlab中plot基本用法的具体使用
Jul 17 Python
详解python os.path.exists判断文件或文件夹是否存在
Nov 16 Python
如何使用python包中的sched事件调度器
Apr 30 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
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
php xml 入门学习资料
2011/01/01 PHP
thinkphp实现like模糊查询实例
2014/10/29 PHP
linux中cd命令使用详解
2015/01/08 PHP
解决PHP里大量数据循环时内存耗尽的方法
2015/10/10 PHP
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
jQuery取得设置清空select选择的文本与值
2014/07/08 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
2014/07/31 Javascript
第六章之辅组类与响应式工具
2016/04/25 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
对于Javascript 执行上下文的全面了解
2017/09/05 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
jquery实现动态添加附件功能
2018/10/23 jQuery
了解javascript中的Dom操作
2019/05/27 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
解析Python中的eval()、exec()及其相关函数
2017/12/20 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
Python中利用aiohttp制作异步爬虫及简单应用
2018/11/29 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
高考考python编程是真的吗
2020/07/20 Python
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
什么是事务?事务有哪些性质?
2012/03/11 面试题
高中生的学习总结自我鉴定
2013/10/26 职场文书
年终考核实施方案
2014/05/26 职场文书
计生专干事迹
2014/05/28 职场文书
员工保密协议书
2014/09/27 职场文书
聘任通知书
2015/09/21 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
python 下划线的多种应用场景总结
2021/05/12 Python
Java字符串逆序方法详情
2022/03/21 Java/Android