2017-08-04 117 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]: 

相关问题