iterrows pandas获取下一行的值

aemubtdh  于 2023-06-20  发布在  其他
关注(0)|答案(5)|浏览(263)

我有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']

有没有更有效的方法来解决这个问题?

cgvd09ve

cgvd09ve1#

首先,你的“混乱的方式”是可以的,在数据框架中使用索引没有什么错,而且不会太慢。iterrows()本身并不是特别快。
你的第一个想法的一个版本是:

row_iterator = df.iterrows()
_, last = row_iterator.next()  # take first item from row_iterator
for i, row in row_iterator:
    print(row['value'])
    print(last['value'])
    last = row

第二种方法可以做类似的事情,将一个索引保存到数据框架中:

last = df.irow(0)
for i in range(1, df.shape[0]):
    print(last)
    print(df.irow(i))
    last = df.irow(i)

当速度是关键的时候,你可以尝试这两种方法并计时代码。

zsbz8rwp

zsbz8rwp2#

itertools文档中有一个pairwise()函数示例:

from itertools import tee, izip
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

import pandas as pd
df = pd.DataFrame(['AA', 'BB', 'CC'], columns = ['value'])

for (i1, row1), (i2, row2) in pairwise(df.iterrows()):
    print i1, i2, row1["value"], row2["value"]

下面是输出:

0 1 AA BB
1 2 BB CC

但是,我认为iter行在一个DataFrame是缓慢的,如果你能解释你想解决的问题,也许我可以建议一些更好的方法。

vuv7lop3

vuv7lop33#

我将使用shift()函数如下:

df['value_1'] = df.value.shift(-1)
[print(x) for x in df.T.unstack().dropna(how = 'any').values];

它产生

AA
BB
BB
CC
CC

这就是上面代码的工作方式:
步骤1)使用移位功能

df['value_1'] = df.value.shift(-1)
print(df)

产生

value value_1
0    AA      BB
1    BB      CC
2    CC     NaN

步骤2)转置:

df = df.T
print(df)

生产:

0   1    2
value    AA  BB   CC
value_1  BB  CC  NaN

步骤3)拆堆:

df = df.unstack()
print(df)

生产:

0  value       AA
   value_1     BB
1  value       BB
   value_1     CC
2  value       CC
   value_1    NaN
dtype: object

步骤4)丢弃NaN值

df = df.dropna(how = 'any')
print(df)

生产:

0  value      AA
   value_1    BB
1  value      BB
   value_1    CC
2  value      CC
dtype: object

步骤5)返回DataFrame的Numpy表示,并按值打印值:

df = df.values
[print(x) for x in df];

生产:

AA
BB
BB
CC
CC
gg58donl

gg58donl4#

这也可以通过izip ping dataframe(迭代器)自身的偏移版本来解决。
当然,索引错误不能以这种方式再现。
看看这个

import pandas as pd
from itertools import izip

df = pd.DataFrame(['AA', 'BB', 'CC'], columns = ['value'])   

for id1, id2 in izip(df.iterrows(),df.ix[1:].iterrows()):
    print id1[1]['value']
    print id2[1]['value']

它给出了

AA
BB
BB
CC
a1o7rhls

a1o7rhls5#

答案的组合给了我一个非常快的运行时间。使用shift方法来创建下一行值的新列,然后像@alisdt一样使用row_iterator函数,但这里我将它从iterrows改为itertuples,速度快了100倍。
我的脚本是用于迭代不同长度的重复 Dataframe ,并为每个重复添加一秒,以便它们都是唯一的。

# create new column with shifted values from the departure time column
df['next_column_value'] = df['column_value'].shift(1)
# create row iterator that can 'save' the next row without running for loop
row_iterator = df.itertuples()
# jump to the next row using the row iterator
last = next(row_iterator)
# because pandas does not support items alteration i need to save it as an object
t = last[your_column_num]
# run and update the time duplications with one more second each
for row in row_iterator:
    if row.column_value == row.next_column_value:
         t = t + add_sec
         df_result.at[row.Index, 'column_name'] = t
    else:
         # here i resetting the 'last' and 't' values
         last = row
         t = last[your_column_num]

希望能有帮助。

相关问题