将apply函数与shift函数结合使用

时间:2017-12-05 21:41:39

标签: python pandas

我正在尝试通过数据帧进行迭代。我的目标是在loop列中前一行和实际行不相等时增加列rpm中的值。

df = pd.DataFrame({'rpm': [5000, 5000, 10000, 10000, 15000, 15000], 
                    'temp': [23, 23, 24, 23, 24, 25]})
df['loop'] = 0

def loop_no(x,y):
    if x.rpm != y.rpm:
        val = y.loop + 1
    else:
        val = x.loop
    return val

df['loop'] = df.apply(lambda x: loop_no(x, x.shift(-1)))

此时,我收到此错误:

AttributeError: ("'Series' object has no attribute 'rpm'", u'occurred at index rpm').

当我使用axis=1时,我没有收到错误。但显然它会在列方向上转移。所以,我没有得到上一行。

df['loop'] = df.apply(lambda x: loop_no(x, x.shift(-1)), axis=1)

1 个答案:

答案 0 :(得分:1)

IIUC

(df.rpm!=df.rpm.shift(-1)).cumsum()
Out[796]: 
0    0
1    1
2    1
3    2
4    2
5    3
Name: rpm, dtype: int32

更多信息

df['loop']=(df.rpm!=df.rpm.shift(-1)).cumsum()
df
Out[799]: 
     rpm  temp  loop
0   5000    23     0
1   5000    23     1
2  10000    24     1
3  10000    23     2
4  15000    24     2
5  15000    25     3