在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基于BeautifulSoup实现抓取网页指定内容的方法
Jul 09 Python
python实现中文分词FMM算法实例
Jul 10 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
Mar 02 Python
详解Python3操作Mongodb简明易懂教程
May 25 Python
Python爬虫DNS解析缓存方法实例分析
Jun 02 Python
python中子类调用父类函数的方法示例
Aug 18 Python
pandas创建新Dataframe并添加多行的实例
Apr 08 Python
通过pycharm使用git的步骤(图文详解)
Jun 13 Python
python 环境搭建 及python-3.4.4的下载和安装过程
Jul 20 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
Oct 18 Python
OpenCV Python实现图像指定区域裁剪
Mar 12 Python
Matplotlib绘制混淆矩阵的实现
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/03/06 新手入门
PHP删除指定目录中的所有目录及文件的方法
2015/02/26 PHP
JSON字符串传到后台PHP处理问题的解决方法
2016/06/05 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
js使用递归解析xml
2014/12/12 Javascript
jQuery中:empty选择器用法实例
2014/12/30 Javascript
Flow之一个新的Javascript静态类型检查器
2015/12/21 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
jQuery+HTML5+CSS3制作支持响应式布局时间轴插件
2016/08/10 Javascript
jquery 手势密码插件
2017/03/17 Javascript
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
前端使用crypto.js进行加密的函数代码
2020/08/16 Javascript
Python中编写ORM框架的入门指引
2015/04/29 Python
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
Python语言的面相对象编程方式初步学习
2016/03/12 Python
详解Python中如何写控制台进度条的整理
2018/03/07 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
Python安装selenium包详细过程
2019/07/23 Python
Python 70行代码实现简单算式计算器解析
2019/08/30 Python
python实现高斯(Gauss)迭代法的例子
2019/11/20 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
python使用梯度下降算法实现一个多线性回归
2020/03/24 Python
Python列表的深复制和浅复制示例详解
2021/02/12 Python
瑞典的玛丽小姐:Miss Mary of Sweden
2019/02/13 全球购物
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
雅诗兰黛澳大利亚官网:Estée Lauder澳大利亚
2019/05/31 全球购物
struct与class的区别
2014/02/03 面试题
幼儿园社区活动总结
2014/07/07 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python
windows11怎么查看自己安装的版本号? win11版本号的查看方法
2021/11/21 数码科技
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技