2017-04-20 3 views

答えて

2

ブール値マスクdf[0] != -1cumprodを使用します。最初の数字が-1になるまで1になり、その時点でFalseが乗算されてゼロになります。それがゼロになると、ゼロのままです。次に、これにdf[0]を掛けます。しかし、これを最初の-1の値を取得するようにシフトします。

df.assign(new=df[0].ne(-1).shift().fillna(True).cumprod().mul(df[0])) 


    0 new 
0 1 1 
1 2 2 
2 3 3 
3 4 4 
4 5 5 
5 6 6 
6 7 7 
7 8 8 
8 -1 -1 
9 2 0 
10 3 0 
11 4 0 
12 5 0 
13 6 0 

あなたは根本的numpyの配列

v = df[0].values 
df.assign(new=v * np.append(True, v[:-1] != -1).cumprod()) 

    0 new 
0 1 1 
1 2 2 
2 3 3 
3 4 4 
4 5 5 
5 6 6 
6 7 7 
7 8 8 
8 -1 -1 
9 2 0 
10 3 0 
11 4 0 
12 5 0 
13 6 0 
2

あなたが最初-1のインデックスのidxmaxを使用することができる任意の行に来て、このインデックスからすべての値を上書きすることができるであろうlocとカラム0の終わりに:

print((df[0] == -1).idxmax()) 
8 

df.loc[(df[0] == -1).idxmax():, 0] = 0 
print (df) 
    0 i_want_that 
0 1   1 
1 2   2 
2 3   3 
3 4   4 
4 5   5 
5 6   6 
6 7   7 
7 8   8 
8 0   0 
9 0   0 
10 0   0 
11 0   0 
12 0   0 
13 0   0 

別の解決策は、cumsumによってブールマスクを取得し、maskによって値を上書きである:

mask = (df[0] == -1).cumsum() != 0 
print (mask) 
0  False 
1  False 
2  False 
3  False 
4  False 
5  False 
6  False 
7  False 
8  True 
9  True 
10  True 
11  True 
12  True 
13  True 
Name: 0, dtype: bool 

df['new'] = df[0].mask(mask, 0) 
print (df) 
    0 i_want_that new 
0 1   1 1 
1 2   2 2 
2 3   3 3 
3 4   4 4 
4 5   5 5 
5 6   6 6 
6 7   7 7 
7 8   8 8 
8 -1   0 0 
9 2   0 0 
10 3   0 0 
11 4   0 0 
12 5   0 0 
13 6   0 0 
+0

を利用することにより、パフォーマンスを向上させることができ、私は新しいの後に-1の値を選択できる[8]とすることができます –

+1

ちょうど私の編集例のように、0の後0 - = 0 ' – jezrael

+0

の2つ目の解では、 'mask =((df [0] == -1).idxmax()+ 1: 1).cumsum()!= 0).shift() ' ' mask.iloc [0] = False' – jezrael

関連する問題