pandas - 基于数据框列结果,所有后续行都等于重复值,直到结果更改并出现新的重复值
问题描述
我的简化数据框如下:
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 列。
- 如果出现“YES”,则后面的行将导致“GOOD”,直到再次出现“YES”或“NO”,反之亦然,“NO”出现,但“BAD”将替换“GOOD”
愿望输出如下:
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')
解决方案
想法是Series.map
首先使用 dy 字典,回填缺失值,然后用fillna
to替换最后一组Series
,用于替换IGNORE
连续值 - 2 或更多:
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
推荐阅读
- javascript - 如何从JS中的数组中删除特定字符?
- python - 给定两个字符串列表,我如何匹配它们以使尽可能多的字符串相同?
- java - Java,ByteBuffer转换为byte[],array()和get()有什么区别?
- javascript - Javascript append 正在通过控制台将子级添加到父级,但未显示在开发工具元素或页面上
- ios - 导航到 Swift tabBar 时不会刷新视图
- java - Liquibase 忽略 databasechangelog 表内容
- wordpress - Wordpress - 如何在同一页面上制作多个自定义滑块?
- database - DolphinDB的createTimeSeriesAggregator函数中,窗口大小和步数有什么关系?
- java - 由于内存限制,GCP 仍然崩溃
- javascript - 将变量的值与对象数组匹配