我有Pandas的df
import pandas as pd
df = pd.DataFrame(['AA', 'BB', 'CC'], columns = ['value'])
我想迭代df中的行。对于每一行,我希望行s value and next row
s值类似于(它不工作):
for i, row in df.iterrows():
print row['value']
i1, row1 = next(df.iterrows())
print row1['value']
结果我想
'AA'
'BB'
'BB'
'CC'
'CC'
*Wrong index error here
在这一点上我有混乱的方式来解决这个问题
for i in range(0, df.shape[0])
print df.irow(i)['value']
print df.irow(i+1)['value']
有没有更有效的方法来解决这个问题?
5条答案
按热度按时间cgvd09ve1#
首先,你的“混乱的方式”是可以的,在数据框架中使用索引没有什么错,而且不会太慢。iterrows()本身并不是特别快。
你的第一个想法的一个版本是:
第二种方法可以做类似的事情,将一个索引保存到数据框架中:
当速度是关键的时候,你可以尝试这两种方法并计时代码。
zsbz8rwp2#
itertools
文档中有一个pairwise()
函数示例:下面是输出:
但是,我认为iter行在一个
DataFrame
是缓慢的,如果你能解释你想解决的问题,也许我可以建议一些更好的方法。vuv7lop33#
我将使用shift()函数如下:
它产生
这就是上面代码的工作方式:
步骤1)使用移位功能
产生
步骤2)转置:
生产:
步骤3)拆堆:
生产:
步骤4)丢弃NaN值
生产:
步骤5)返回DataFrame的Numpy表示,并按值打印值:
生产:
gg58donl4#
这也可以通过
izip
ping dataframe(迭代器)自身的偏移版本来解决。当然,索引错误不能以这种方式再现。
看看这个
它给出了
a1o7rhls5#
答案的组合给了我一个非常快的运行时间。使用shift方法来创建下一行值的新列,然后像@alisdt一样使用row_iterator函数,但这里我将它从iterrows改为itertuples,速度快了100倍。
我的脚本是用于迭代不同长度的重复 Dataframe ,并为每个重复添加一秒,以便它们都是唯一的。
希望能有帮助。