最近做一个系列博客,跟着stackoverflow学Pandas。
专栏地址:http://blog.csdn.net/column/details/16726.html
以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stackoverflow.com/questions/tagged/pandas?sort=votes&pageSize=15
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进行操作时,我们不可避免的需要逐行查看或操作数据,那么有什么高效、快捷的方法呢?
这似乎是最常规的办法,而且可以在迭代的过程中对DataFrame进行操作。
df.values 是 numpy.ndarray 类型 这里 i 是index的序号, row是numpy.ndarray类型。
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 120df.iterrows() 的每次迭代都是一个tuple类型,包含了index和每行的数据。
采用iterrows的方法,得到的 row 是一个Series,DataFrame的dtypes不会被保留。返回的Series只是一个原始DataFrame的复制,不可以对原始DataFrame进行修改;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.c2itertuples 返回的是一个 pandas.core.frame.Pandas 类型。
普遍认为itertuples 比 iterrows的速度要快。
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可以发现在时间花销上, izip > zip > itertuples > enumerate > iterrows > range(index)