我有以下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]
请帮忙。
答案 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]: