2017-08-04 11 views
0

は、私は2つのcols SEQ_NOヴァルと、次のdfています特定のインデックスでpandasデータフレーム列の値を繰り返す方法は?

 seq_no  val  expected_result 
0  21  0   0 
1  21  0   0 
2  21  1   0 
3  22  1   1 #seq_no changed 
4  22  1   1 
5  22  6   1 
6  23  6   6 #seq_no changed 
7  23  7   6 
8  24  7   7 #seq_no changed 
9  24  12  7 
10  25  12  12 #seq_no changed 
11  25  12  12 
12  25  13  12 

SEQ_NOが2行以上に繰り返されていることが分かる、指名手配されて何が新しい列expected_resultを作成することです場合、SEQ_NOはヴァル下でどのような値そのインデックスで、変更されるたびにチェックされ、その値がが再びSEQ_NOが変更され刚性expected_resultで繰り返されます。

expected_result colは私が望むものを示しています。基本的にseq_noが変化しているインデックスを取得する必要があり、それらのインデックスでの値をチェックし、seq_noが変更されるかidx_listから次のインデックスが検出されるまでこれらの値を繰り返します。

私は必要なインデックスのリストを見つけることができましたが、それ以上の操作を続けました。

i = df.seq_no.values 

df["bool"] = np.append(True, idx[:-1] != idx[1:]) 
list1 = df[df["bool"] == True].index.tolist() 
list1 

後SEQ_NOが変化しているインデックスのリストです:

Out [ ] : list1 
     [0, 3, 6, 8, 10] 

助けてください。

答えて

0

あなたはffilldf.reindex続く、df.diffを使用することができます。

In [1363]: df[df.diff().fillna(1)['seq_no'] > 0].val.reindex(df.index, method='ffill') 
Out[1363]: 
0  0 
1  0 
2  0 
3  1 
4  1 
5  1 
6  6 
7  6 
8  7 
9  7 
10 12 
11 12 
12 12 
Name: val, dtype: int64 

これはあなたのexpected_output列と同じです。

あなただけの場所で新しい列にこれを割り当てることができます。

df['expected_output'] = ... 
+0

@COLDSPEED更新された部分を見て、私は何ができるのですか?助けてくれてありがとう。 – kshama

+0

@kshamaそれは良い考えではありません。あなたはそれを編集することによって問題を判読不能にします。新しい質問をすることをお勧めします。 –

+0

@COLDSPEED https://stackoverflow.com/questions/45526511/how-to-create-new-column-by-comparing-values-of-other-columnsご確認ください – kshama

0

あなたはまた、すなわち分値のグループ化されたシリーズを作成することにより、マップを使用することができます

df['new_expected']=df['seq_no'].map(df.groupby('seq_no')['val'].min()) 

出力:

 
    seq_no val expected_result new_expected 
0  21 0    0    0 
1  21 0    0    0 
2  21 1    0    0 
3  22 1    1    1 
4  22 1    1    1 
5  22 6    1    1 
6  23 6    6    6 
7  23 7    6    6 
8  24 7    7    7 
9  24 12    7    7 
10  25 12    12   12 
11  25 12    12   12 
12  25 13    12   12 
In [483]: 

関連する問題