python - 有条件地删除组中的最后一行

标签 python pandas dataframe

我确实有以下数据框

df1 = pd.DataFrame({'case':[1,1,1,1,1,1,2,2,2,2,6,6,6,6,6,3,3,3,3,3,3], 
                    'action':['A','B','C','B','D','A','B','B','D','A','B','B','D','A','F','A','B','C','B','D','A']})

    case action
0      1      A
1      1      B
2      1      C
3      1      B
4      1      D
5      1      A
6      2      B
7      2      B
8      2      D
9      2      A
10     6      B
11     6      B
12     6      D
13     6      A
14     6      F
15     3      A
16     3      B
17     3      C
18     3      B
19     3      D
20     3      A

如果在 case-group 中,倒数第二个 action 值是 D 并且最后一个 action 值of a 是 A 那么最后一行必须被删除。 结果应该是:

df2 = pd.DataFrame({'case':[1,1,1,1,1,2,2,2,6,6,6,6,6,3,3,3,3,3], 
                    'action':['A','B','C','B','D','B','B','D','B','B','D','A','F','A','B','C','B','D']})

    case action
0      1      A
1      1      B
2      1      C
3      1      B
4      1      D
5      2      B
6      2      B
7      2      D
8      6      B
9      6      B
10     6      D
11     6      A
12     6      F
13     3      A
14     3      B
15     3      C
16     3      B
17     3      D

几乎什么都试过了。感谢任何帮助。

最佳答案

groupbytailshift

t = df1.groupby('case').tail(2)
m = t['action'].eq('A') & t.groupby('case')['action'].shift().eq('D')
df1.drop(m[m].index)

说明

Group 数据帧 df1case 并使用 从每个组中选择最后的 2 行尾(2)

>>> t

    case action
4      1      D
5      1      A
8      2      D
9      2      A
13     6      A
14     6      F
19     3      D
20     3      A

现在 group 数据帧 tcaseshiftaction向下一个单位

>>> t.groupby('case')['action'].shift()

4     NaN
5       D
8     NaN
9       D
13    NaN
14      A
19    NaN
20      D
Name: action, dtype: object

通过比较 action 列与 A 和移动 action 列与 D 分别创建一个 bool 掩码,然后取两个掩码的逻辑与

>>> m

4     False
5      True
8     False
9      True
13    False
14    False
19    False
20     True
Name: action, dtype: bool

Drop 数据帧 df1 中对应于掩码 m 中具有 True 值的索引的行

>>> df1.drop(m[m].index)

    case action
0      1      A
1      1      B
2      1      C
3      1      B
4      1      D
6      2      B
7      2      B
8      2      D
10     6      B
11     6      B
12     6      D
13     6      A
14     6      F
15     3      A
16     3      B
17     3      C
18     3      B
19     3      D

关于python - 有条件地删除组中的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67136202/

相关文章:

python - 使用 Chef 时“pip install -rrequirements.txt”失败

python - 足球数据的多元多项式拟合

python - 将 CNTK virtualenv 添加到 Visual Studio Python 项目

python - 如果在值中找到嵌套字典中另一个键的值,则替换字典中的值

python - Pandas 不会丢弃符合条件的行和列

python - 在 Pandas 中如何从另一列的观察和聚合值创建新列

用 id 替换另一个数据帧中的 NA 值

pandas - 将工作日添加到带有日期的 Pandas 数据框并跳过假期python

python - 在Python中使用列表理解读取文本文件并将一些值转换为 float

python - 将具有 `NaN` 的稀疏 Pandas 数据帧转换为整数值