最近做一个系列博客,跟着stackoverflow学Pandas。

以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序:

https://stackoverflow.com/questions/tagged/pandas?sort=votes&pageSize=15

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)

【跟着stackoverflow学Pandas】How to iterate over rows in a DataFrame in Pandas-DataFrame按行迭代的更多相关文章

  1. 【跟着stackoverflow学Pandas】 - Adding new column to existing DataFrame in Python pandas - Pandas 添加列

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  2. 【跟着stackoverflow学Pandas】 -Get list from pandas DataFrame column headers - Pandas 获取列名

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  3. 【跟着stackoverflow学Pandas】add one row in a pandas.DataFrame -DataFrame添加行

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  4. 【跟着stackoverflow学Pandas】Select rows from a DataFrame based on values in a column -pandas 筛选

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  5. 【跟着stackoverflow学Pandas】“Large data” work flows using pandas-pandas大数据处理流程

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  6. 【跟着stackoverflow学Pandas】Delete column from pandas DataFrame-删除列

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  7. 【跟着stackoverflow学Pandas】Renaming columns in pandas-列的重命名

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  8. 学机器学习,不会数据处理怎么行?—— 二、Pandas详解

    在上篇文章学机器学习,不会数据处理怎么行?—— 一.NumPy详解中,介绍了NumPy的一些基本内容,以及使用方法,在这篇文章中,将接着介绍另一模块——Pandas.(本文所用代码在这里) Panda ...

  9. 跟着百度学PHP[14]-PDO之Mysql的事务处理2

    前面所将仅仅是在纯mysql下的讲解,这节就是要将其搬到PDO台面上来了. 将自动提交关闭. SetAttribute下有一个PDO::ATTR_AUTOCOMMIT 将其设置为0即可关闭,如:$pd ...

随机推荐

  1. 20145307《信息安全系统设计基础》第五周学习总结PT2

    20145307<信息安全系统设计基础>第五周学习总结PT2: 教材学习内容总结 之前有第一部分学习总结: http://www.cnblogs.com/Jclemo/p/5962219. ...

  2. scrapy之手机app抓包爬虫

    手机App抓包爬虫 1. items.py class DouyuspiderItem(scrapy.Item): name = scrapy.Field()# 存储照片的名字 imagesUrls ...

  3. java和groovy的混用

    java在语言的动态性方便不是很灵活,如果你想快速增加或改变一些方法,那么只能通过反射机制,并且参数传递的格式很严格. 相比之下,基于groovy可以快速写出一些自定义方法,并能和java很好结合,类 ...

  4. Codeforces Round #365 (Div. 2) E - Mishka and Divisors(转化成01-背包)

    http://codeforces.com/contest/703/problem/E 题意: 给出n个数和一个k,计算出至少要多少个数相乘才是k的倍数. 思路:这道题目参考了杭电大神的代码http: ...

  5. HDU 1827 Summer Holiday

    http://acm.hdu.edu.cn/showproblem.php?pid=1827 题意: 听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家 ...

  6. [spring mvc]Hello World入门

    1.新建项目 File->New->Other,选择Dynamic web project: 项目建好之后,目录结构如下: 2.WEB-INF/web.xml 中配置 dispatcher ...

  7. 我的Android学习路线(一)

    最近实在是闲的无聊,本着不能让自己的时间白白流失的目的,我就决定完成一下之前的诺言:把 Android 开发学了.正好手头有一本<Android 4编程入门经典>,于是便用两天时间把视图部 ...

  8. Daper返回DataTable

    using (IDbConnection conn = OpenConnection()) { string sql = "SELECT TOP 1 * FROM dbo.Students& ...

  9. kindeditor支持flv视频播放方法

    打开plugins\media下面的media.js,打开,找到下面的代码: var html = K.mediaImg(self.themesPath + ‘common/blank.gif’, { ...

  10. 在阿里云服务器上搭建 Apache Tomat 应用

    在阿里云上购买一台服务器,系统采用 window 2008 Server 企业版,64位 1.下载Java7 JRE,安装 http://www.java.com/zh_CN/download/man ...