基于数据框列的结果,随后的所有行都等于一个重复值,直到结果更改并出现新的重复值 [英] based on dataframe column result all following rows equal a repetitive value until result changes and new repetitive value occurs
本文介绍了基于数据框列的结果,随后的所有行都等于一个重复值,直到结果更改并出现新的重复值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的简化数据框如下:
df = pd.DataFrame()
df['A'] = ('IGNORE','IGNORE','IGNORE','YES','IGNORE','YES','YES','YES','IGNORE','IGNORE','IGNORE','YES','IGNORE','IGNORE','IGNORE','IGNORE','IGNORE','IGNORE','IGNORE','IGNORE','IGNORE', 'NO','IGNORE','IGNORE','IGNORE','IGNORE')
我需要反转数据帧(我知道我可以通过df = df [::-1]完成此操作),然后按如下所示制作B列.
I need to reverse dataframe (which I know I can do via df = df[::-1]) then make column B as follows.
- 如果出现是",则随后的行将导致良好",直到再次出现是"或否"为止,反之亦然,发生否"的情况除外,除非不良"将替代良好"
期望输出如下:
df['B'] = ('GOOD','GOOD','GOOD','YES','IGNORE','YES','YES','YES','GOOD','GOOD','GOOD','YES','BAD','BAD','BAD','BAD','BAD','BAD','BAD','BAD','BAD', 'NO','IGNORE','IGNORE','IGNORE','IGNORE')
推荐答案
Idea is use Series.map
dy dictioanry first with back filling missing values and replace last group by fillna
to Series
, which is used for replace IGNORE
consecutive values - 2 or more:
s = df['A'].map({'IGNORE': np.nan, 'YES':'GOOD', 'NO':'BAD'}).bfill().fillna(df['A'])
m1 = df.groupby(df['A'].ne(df['A'].shift()).cumsum())['A'].transform('size').ne(1)
m2 = df['A'].eq('IGNORE')
df['C'] = np.where(m1 & m2, s, df['A'])
print(df)
A B C
0 IGNORE GOOD GOOD
1 IGNORE GOOD GOOD
2 IGNORE GOOD GOOD
3 YES YES YES
4 IGNORE IGNORE IGNORE
5 YES YES YES
6 YES YES YES
7 YES YES YES
8 IGNORE GOOD GOOD
9 IGNORE GOOD GOOD
10 IGNORE GOOD GOOD
11 YES YES YES
12 IGNORE BAD BAD
13 IGNORE BAD BAD
14 IGNORE BAD BAD
15 IGNORE BAD BAD
16 IGNORE BAD BAD
17 IGNORE BAD BAD
18 IGNORE BAD BAD
19 IGNORE BAD BAD
20 IGNORE BAD BAD
21 NO NO NO
22 IGNORE IGNORE IGNORE
23 IGNORE IGNORE IGNORE
24 IGNORE IGNORE IGNORE
25 IGNORE IGNORE IGNORE
这篇关于基于数据框列的结果,随后的所有行都等于一个重复值,直到结果更改并出现新的重复值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文