如何在特定索引处的pandas数据框列中重复值?

时间:2017-08-04 03:26:13

标签: python pandas numpy dataframe

我有以下df,其中有两个cols seq_no val

     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]

请帮忙。

2 个答案:

答案 0 :(得分:0)

您可以使用df.diff,然后df.reindex使用ffill

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'] = ...

答案 1 :(得分:0)

您还可以通过创建分组的最小值系列来使用map,即

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