如何迭代pandas dataframe的行
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
在对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和每行的数据。
- 采用iterrows的方法,得到的 row 是一个Series,DataFrame的dtypes不会被保留。
- 返回的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的行的更多相关文章
- pandas.DataFrame的pivot()和unstack()实现行转列
示例: 有如下表需要进行行转列: 代码如下: # -*- coding:utf-8 -*- import pandas as pd import MySQLdb from warnings impor ...
- pandas取dataframe特定行/列
1. 按列取.按索引/行取.按特定行列取 import numpy as np from pandas import DataFrame import pandas as pd df=DataFram ...
- pandas DataFrame行或列的删除方法
pandas DataFrame的增删查改总结系列文章: pandas DaFrame的创建方法 pandas DataFrame的查询方法 pandas DataFrame行或列的删除方法 pand ...
- [译]如何根据条件从pandas DataFrame中删除不需要的行?
问题来源:https://stackoverflow.com/questions/13851535/how-to-delete-rows-from-a-pandas-dataframe-based-o ...
- pandas.DataFrame学习系列1——定义及属性
定义: DataFrame是二维的.大小可变的.成分混合的.具有标签化坐标轴(行和列)的表数据结构.基于行和列标签进行计算.可以被看作是为序列对象(Series)提供的类似字典的一个容器,是panda ...
- pandas DataFrame apply()函数(1)
之前已经写过pandas DataFrame applymap()函数 还有pandas数组(pandas Series)-(5)apply方法自定义函数 pandas DataFrame 的 app ...
- pandas DataFrame.shift()函数
pandas DataFrame.shift()函数可以把数据移动指定的位数 period参数指定移动的步幅,可以为正为负.axis指定移动的轴,1为行,0为列. eg: 有这样一个DataFrame ...
- pandas DataFrame(3)-轴
和numpy数组(5)-二维数组的轴一样,pandas DataFrame也有轴的概念,决定了方法是对行应用还是对列应用: 以下面这个数据为例说明: 这个数据是5个车站10天内的客流数据: rider ...
- pandas DataFrame(4)-向量化运算
pandas DataFrame进行向量化运算时,是根据行和列的索引值进行计算的,而不是行和列的位置: 1. 行和列索引一致: import pandas as pd df1 = pd.DataFra ...
随机推荐
- c++获取时间戳
vc获取时间戳的代码如下: SYSTEMTIME st; }; GetLocalTime(&st); // vc专用 _snprintf_s(ts, sizeof(ts), "%4d ...
- 20145332卢鑫 WEB基础
20145332卢鑫 WEB基础 实验过程 1.环境配置 2.简单的网页编写 3.javascript相关 1.相关概念:JavaScript是一种广泛用于客户端Web开发的脚本语言,常用来给HTML ...
- CAN通信(STM32)
1.CAN是控制器局域网络(Controller Area Network, CAN)的简称 (理论知识不做讲解了,太多了) 2.芯片选用:TJA1050 差分信号输入, 这里的显性电平CANH和CA ...
- DTMF在VOIP中的解决方案
双音多频DTMF(Dual Tone Multi-Frequency)信令,因其提供更高的拨号速率,迅速取代了传统转盘式电话机使用的拨号脉冲信令.DTMF也应用在交互式控制中,诸如语言菜单.语言邮件. ...
- 网络安全、Web安全、渗透测试之笔经面经总结(二)
这篇文章涉及的知识点有如下几方面: 1.SSL Strip(SSp)攻击到底是什么? 2.中间人攻击——ARP欺骗的原理.实战及防御 3会话劫持原理 4.CC攻击 5.添加时间戳防止重放攻击 6.浅析 ...
- 【第九章】 springboot + mybatis + 多数据源 (AOP实现)
在第八章 springboot + mybatis + 多数据源代码的基础上,做两点修改 1.ShopDao package com.xxx.firstboot.dao; import org.spr ...
- HDU 3466 Proud Merchants(0-1背包)
http://acm.hdu.edu.cn/showproblem.php?pid=3466 题意: 最近,iSea去了一个古老的国家.在这么长的时间里,它是世界上最富有和最强大的王国.结果,这个国家 ...
- yii2 高级版新建一个应用(api应用为例子)
先在项目的根目录下复制一份 backend 为 api: cp backend/ api -r 拷贝 api 环境 cp -a environments/dev/frontend environmen ...
- xtu 1242 Yada Number 打表
Yada Number Time Limit : 2000 MS Memory Limit : 65536 KB Yada Number Problem Description: ...
- PHP概率,抽奖
随机数,游标卡尺. 一个大饼,随机到哪个坑里,就中哪个奖. 大转盘! 公平公正! // 获取锦鲤 public function getGoldPig() { $pig_gift_bag = [ [ ...