2017-12-05 18 views
0

私はデータフレームを反復しようとしています。私の目標は、列loopの値を、前の行であるrpmの列と実際の行が等しくないときに増やすことです。この時点でシフト関数と組み合わせてapply関数を使用する

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))) 

、私はこのエラーを取得する:私はaxis=1を使用する場合

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

、私はエラーを得ることはありません。しかし明らかに列方向にシフトします。だから、私は前の行を取得しません。答えを

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

答えて

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 
+0

感謝。それは素晴らしい作品です。しかし、なぜ私の方法がうまくいかないのか分かりません。私のように反復することはできないのですか? @StephanF。 –

+2

。 applyは行を基底としています。つまり、関数が1つの車線データを受け取るたびに、ここにシフトがありません。またはそのシフトは常にNaNになります。関数のようなものが必要な場合は、 'for loop'と考えることができます – Wen

+0

これは明らかにします。私は非常に遅いので、iteritemsを避けようとしました。 –

関連する問題