python - 如何应用多个条件从数据框(熊猫)中删除/选择特定行?
问题描述
我有以下数据框:
id outcome
0 3 no
1 3 no
2 3 no
3 3 yes
4 3 no
5 5 no
6 5 no
7 5 yes
8 5 yes
9 6 no
10 6 no
11 6 yes
12 6 yes
13 6 yes
14 6 yes
15 6 yes
16 6 no
17 6 no
18 6 no
19 7 no
20 7 no
21 7 yes
22 7 yes
23 7 no
24 7 no
25 7 no
26 7 yes
它基于 id 分组,并且按日期升序排列。
我想满足几个条件。
如果它之后的行具有相同的结果,我想删除当前行。
如果一行是“是”,那么下一行必须是第一个“否”。
我还必须有最后一个“是”值。
此外,我还想将最后一个“否”保持在“是”之上(因此在“是”之上可能有 2 个“否”值:基本上在一行中,第一个和最后一个“否”是“否”)。
这是上述数据框的预期结果:
id outcome
2 3 no
3 3 yes
4 3 no
6 5 no
8 5 yes
10 6 no
15 6 yes
16 6 no
20 7 no
22 7 yes
23 7 no
25 7 no
26 7 yes
目前我已经创建了几个这样的面具:
df = pd.DataFrame(data={'id':[3,3,3,3,3,5,5,5,5,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7],
'outcome': ['no','no','no','yes','no','no','no','yes','yes','no','no','yes','yes','yes','yes','yes','no','no','no', 'no', 'yes', 'no', 'no', 'yes']})
m1 = df['outcome'] # mask 1 is the outcome column as a dataframe
m2 = m1.groupby(df['id']).shift(-1) # grouped by id and shifts values up (negative direction) by 1
m3 = m1.groupby(df['id']).shift().eq('yes')&m1.eq('no') # boolean check
df2 = df[~m1.eq(m2)|m3]
m4 = df2['outcome']
m5 = m4.groupby(df2['id']).shift()
df3 = df2[~m4.eq(m5)]
但是,对于上述内容,我不会将第一个和最后一个“否”置于“是”之上。
解决方案
你在这个问题的正确道路上
g = df.groupby('id')['outcome']
cond1 = g.shift().eq('yes') | g.shift(-1).eq('yes')
out = df[cond1 & df.outcome.ne('yes') | (df.outcome.eq('yes') & g.shift().ne('yes') ) ]
id outcome
2 3 no
3 3 yes
4 3 no
6 5 no
7 5 yes
10 6 no
11 6 yes
16 6 no
20 7 no
21 7 yes
23 7 no
25 7 no
26 7 yes
推荐阅读
- ruby-on-rails - 如果当前不存在,如何让 rails fields_for 建立一个新的关联?
- javascript - 在 React 中的 clearInterval 之后重新启动 setInterval
- intellij-idea - IntelliJ IDEA:在 javascript 中提取常量
- c++ - 我觉得我放入结构中的输入代码可以压缩,关于如何在保持代码简短的同时保持数据独立的任何建议?
- visual-studio - 如何在 vuforia Unity Ground Plane 中隐藏/取消隐藏 3d 对象
- javascript - 在谷歌浏览器中获取生产站点上的位置时权限被拒绝错误
- html - 我正在尝试为新闻与其类别之间的模型建立关系
- python - 需要帮助找出 for 循环中的逻辑
- java - 画布撤消操作不起作用 - 如何?
- php - 无法下载文件 Symfony 3.4 和 VueJS