2016-06-18 12 views
2

私はデータフレーム(ev)を持っています。私はそれを読んでおり、 'trig'列の値が64であれば、critical列の値を更新する必要があります。上の4行で、999に変更します。以下のコードを試しましたが、何も変更されませんが、動作するはずです。現在の条件でデータフレームの前の行を更新する

shift後にあなたが NaNを取得するので、私は、あなたが fillna Falsemaskによって maskをすることができると思い
for i in range(0,len(ev)): 
    if ev['trig'][i] == 64: 
     ev['critical'][i-4] == 999 

答えて

0

これを試してみてください、あなたが接近していた:私の答えを更新参照してください。ダブル"=="

for i in range(0,len(ev)): 
     if ev['trig'][i] == 64: 
      ev['critical'][i-4] = 999 
+0

。@ユーザーはあなたも答えをupvoteすることができます。 – Merlin

0

import pandas as pd 

ev = pd.DataFrame({'trig':[1,2,3,2,4,6,8,9,64,6,7,8,6,64], 
        'critical':[4,5,6,3,5,7,8,9,0,7,6,4,3,5]}) 

print (ev) 
    critical trig 
0   4  1 
1   5  2 
2   6  3 
3   3  2 
4   5  4 
5   7  6 
6   8  8 
7   9  9 
8   0 64 
9   7  6 
10   6  7 
11   4  8 
12   3  6 
13   5 64 
mask = (ev.trig == 64).shift(-4).fillna(False) 
print (mask) 
0  False 
1  False 
2  False 
3  False 
4  True 
5  False 
6  False 
7  False 
8  False 
9  True 
10 False 
11 False 
12 False 
13 False 
Name: trig, dtype: bool 
ev['critical'] = ev.critical.mask(mask, 999) 
print (ev) 
    critical trig 
0   4  1 
1   5  2 
2   6  3 
3   3  2 
4  999  4 
5   7  6 
6   8  8 
7   9  9 
8   0 64 
9  999  6 
10   6  7 
11   4  8 
12   3  6 
13   5 64 

EDIT:

タイミング:大規模なデータフレームに、それは非常に遅いので

私がより良いと思うが、pandasに繰り返しを避けている:

len(df)=1400

In [66]: %timeit (jez(ev)) 
1000 loops, best of 3: 1.29 ms per loop 

In [67]: %timeit (mer(ev1)) 
10 loops, best of 3: 49.9 ms per loop  

len(df)=14k

In [59]: %timeit (jez(ev)) 
100 loops, best of 3: 2.49 ms per loop 

In [60]: %timeit (mer(ev1)) 
1 loop, best of 3: 501 ms per loop 

len(df)=140k

In [63]: %timeit (jez(ev)) 
100 loops, best of 3: 15.8 ms per loop 

In [64]: %timeit (mer(ev1)) 
1 loop, best of 3: 6.32 s per loop 

コードタイミング用:

import pandas as pd 

ev = pd.DataFrame({'trig':[1,2,3,2,4,6,8,9,64,6,7,8,6,64], 
        'critical':[4,5,6,3,5,7,8,9,0,7,6,4,3,5]}) 

print (ev) 
ev = pd.concat([ev]*100).reset_index(drop=True) 
#ev = pd.concat([ev]*1000).reset_index(drop=True) 
#ev = pd.concat([ev]*10000).reset_index(drop=True) 

ev1 = ev.copy() 

def jez(df): 
    ev['critical'] = ev.critical.mask((ev.trig == 64).shift(-4).fillna(False), 999) 
    return (ev) 

def mer(df): 
    for i in range(0,len(ev)): 
     if ev['trig'][i] == 64: 
      ev['critical'][i-4] = 999 
    return (ev) 

print (jez(ev))  
print (mer(ev1)) 
+0

対単一"="について学びます。 – jezrael

関連する問題