from:https://blog.csdn.net/tanzuozhev/article/details/76713387

How to iterate over rows in a DataFrame in Pandas-DataFrame按行迭代

https://stackoverflow.com/questions/16476924/how-to-iterate-over-rows-in-a-dataframe-in-pandas

http://stackoverflow.com/questions/7837722/what-is-the-most-efficient-way-to-loop-through-dataframes-with-pandas

在对DataFrame进行操作时,我们不可避免的需要逐行查看或操作数据,那么有什么高效、快捷的方法呢?

index序号索引

import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp)
for x in xrange(len(df.index)):
print df['c1'].iloc[x]

这似乎是最常规的办法,而且可以在迭代的过程中对DataFrame进行操作。

enumerate

for i, row in enumerate(df.values):
index= df.index[i]
print row

df.values 是 numpy.ndarray 类型
这里 i 是index的序号, row是numpy.ndarray类型。

iterrows

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iterrows.html

import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp) for index, row in df.iterrows():
print row['c1'], row['c2'] #10 100
#11 110
#12 120

df.iterrows() 的每次迭代都是一个tuple类型,包含了index和每行的数据。

  1. 采用iterrows的方法,得到的 row 是一个Series,DataFrame的dtypes不会被保留。
  2. 返回的Series只是一个原始DataFrame的复制,不可以对原始DataFrame进行修改;

itertuples

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.itertuples.html

import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp) for row in df.itertuples():
# print row[0], row[1], row[2] 等同于
print row.Index, row.c1, row.c2

itertuples 返回的是一个 pandas.core.frame.Pandas 类型。

普遍认为itertuples 比 iterrows的速度要快。

zip / itertools.izip

zip 和 itertools.izip的用法是相似的, 但是zip返回一个list,而izip返回一个迭代器。 如果数据量很大,zip的性能不及izip

from itertools import izip
import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp) for row in izip(df.index, df['c1'], df['c2']):
print row

时间测评

import time
from numpy.random import randn df = pd.DataFrame({'a': randn(100000), 'b': randn(100000)}) time_stat = [] # range(index)
test_list = []
t = time.time()
for r in xrange(len(df)):
test_list.append((df.index[r], df.iloc[r,0], df.iloc[r,1]))
time_stat.append(time.time()-t) # enumerate
test_list = []
t = time.time()
for i, r in enumerate(df.values):
test_list.append((df.index[i], r[0], r[1]))
time_stat.append(time.time()-t) # iterrows
test_list = []
t = time.time()
for i,r in df.iterrows():
test_list.append((df.index[i], r['a'], r['b']))
time_stat.append(time.time()-t) #itertuples
test_list = []
t = time.time()
for ir in df.itertuples():
test_list.append((ir[0], ir[1], ir[2]))
time_stat.append(time.time()-t) # zip
test_list = []
t = time.time()
for r in zip(df.index, df['a'], df['b']):
test_list.append((r[0], r[1], r[2]))
time_stat.append(time.time()-t) # izip
test_list = []
t = time.time()
from itertools import izip
for r in izip(df.index, df['a'], df['b']):
test_list.append((r[0], r[1], r[2]))
time_stat.append(time.time()-t) time_df = pd.DataFrame({'items':['range(index)', 'enumerate', 'iterrows', 'itertuples' , 'zip', 'izip'], 'time':time_stat}) time_df.sort_values('time') items time
5 izip 0.034869
4 zip 0.040440
3 itertuples 0.072604
1 enumerate 0.174094
2 iterrows 4.026293
0 range(index) 21.921407

可以发现在时间花销上, izip > zip > itertuples > enumerate > iterrows > range(index)

如何迭代pandas dataframe的行的更多相关文章

  1. pandas.DataFrame的pivot()和unstack()实现行转列

    示例: 有如下表需要进行行转列: 代码如下: # -*- coding:utf-8 -*- import pandas as pd import MySQLdb from warnings impor ...

  2. pandas取dataframe特定行/列

    1. 按列取.按索引/行取.按特定行列取 import numpy as np from pandas import DataFrame import pandas as pd df=DataFram ...

  3. pandas DataFrame行或列的删除方法

    pandas DataFrame的增删查改总结系列文章: pandas DaFrame的创建方法 pandas DataFrame的查询方法 pandas DataFrame行或列的删除方法 pand ...

  4. [译]如何根据条件从pandas DataFrame中删除不需要的行?

    问题来源:https://stackoverflow.com/questions/13851535/how-to-delete-rows-from-a-pandas-dataframe-based-o ...

  5. pandas.DataFrame学习系列1——定义及属性

    定义: DataFrame是二维的.大小可变的.成分混合的.具有标签化坐标轴(行和列)的表数据结构.基于行和列标签进行计算.可以被看作是为序列对象(Series)提供的类似字典的一个容器,是panda ...

  6. pandas DataFrame apply()函数(1)

    之前已经写过pandas DataFrame applymap()函数 还有pandas数组(pandas Series)-(5)apply方法自定义函数 pandas DataFrame 的 app ...

  7. pandas DataFrame.shift()函数

    pandas DataFrame.shift()函数可以把数据移动指定的位数 period参数指定移动的步幅,可以为正为负.axis指定移动的轴,1为行,0为列. eg: 有这样一个DataFrame ...

  8. pandas DataFrame(3)-轴

    和numpy数组(5)-二维数组的轴一样,pandas DataFrame也有轴的概念,决定了方法是对行应用还是对列应用: 以下面这个数据为例说明: 这个数据是5个车站10天内的客流数据: rider ...

  9. pandas DataFrame(4)-向量化运算

    pandas DataFrame进行向量化运算时,是根据行和列的索引值进行计算的,而不是行和列的位置: 1. 行和列索引一致: import pandas as pd df1 = pd.DataFra ...

随机推荐

  1. 20145305 《网络对抗》Web安全基础实践

    实践过程及结果截图 Phishing with XSS 在文本框里面写一个钓鱼网站代码就可以了 </form> <script> function hack(){ XSSIma ...

  2. 《将博客搬至51CTO》

    想把你的博客搬家到51CTO吗?想拥有一键式搬家的体验吗? 就算家大业大不好搬也没关系,我们帮你! 51CTO推出专业的搬家工具,用最短的时间.最快的速度,为你在这儿搭建一个温馨的家. 在这儿,你可以 ...

  3. Android移植学习笔记

    1.一头雾水不知道用什么编译环境,不知道用什么下载软件 编译软件:Ubuntu12.04(编译主机系统),JDK(Java) 下载软件: 模拟器: qemu

  4. C++ 表示一个区间值得方法

    C++中不允许这样的写法 85<= score <=100;你要想表示85<=score<=100的话只能这么写score>=85&&score<= ...

  5. startActivityForResult( )用法

    一.与startActivity( )的不同之处 1, startActivity( ) 仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( ). 2, start ...

  6. BZOJ 2141 排队(树状数组套treap)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2141 题意:给出一个数列A,每次交换两个数的位置.输出交换后逆序对的个数. 思路:首先, ...

  7. Linux多线程--使用互斥量同步线程【转】

    本文转载自:http://blog.csdn.net/ljianhui/article/details/10875883 前文再续,书接上一回,在上一篇文章:Linux多线程——使用信号量同步线程中, ...

  8. openwrt如何单独编译uboot

    答:make package/boot/uboot-<chip series>/compile

  9. mips32和x86下的大小端模式判定

    一.背景 1.1 mips32搭载32bit vxworks操作系统 1.2 x86搭载64bit windows10操作系统 二.大小端模式判定前的准备 2.1 先要知道各种架构上各种整型数占据的b ...

  10. 九数组分数|2015年蓝桥杯B组题解析第五题-fishers

    九数组分数 1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码. #include <stdio.h> void t ...