2017-08-04 38 views
0

我有兩個的cols seq_noVAL跟隨DF:如何在特定索引的熊貓數據框列中重複值?

 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改變時,該索引的任何值是根據VAL檢查和值重複EXPECTED_RESULT,直到再次seq_no改變的。

expected_result col說明了我想要的。基本上需要獲得seq_no變化的索引,然後在這些索引處檢查val下的值,然後重複這些值直到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

您可以使用df.diff,其次是df.reindexffill

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]: 

相關問題