首页 > 解决方案 > 将第一行和最后一行保留在 Pandas 中存在子字符串的组中的最佳方法

问题描述

我有以下格式的 DataFrame

   Event     |   Start Time      |   ID
Type 1 - A       2020-02-03           1
Type 1 - B       2020-02-04           1 
Type 2 - A       2020-02-05           1
Type 1 - C       2020-02-06           1
Type 2 - B       2020-02-07           1
Type 2 - C       2020-02-08           1
Type 1 - D       2020-02-09           1
Type 1 - A       2020-02-03           2
  ....             ....             ....

我想保留“类型 1”的所有事件,但在按 ID 分组时只包括“类型 2”的第一个和最后一个事件。

因此,对于 ID 1,我希望输出为

   Event     |   Start Time      |   ID
Type 1 - A       2020-02-03           1
Type 1 - B       2020-02-04           1 
Type 2 - A       2020-02-05           1
Type 1 - C       2020-02-06           1
Type 2 - C       2020-02-08           1
Type 1 - D       2020-02-09           1
Type 1 - A       2020-02-03           2
  ....             ....             ....

实现这一目标的最佳方法是什么?

标签: pythonpandas

解决方案


想法是通过创建掩码Series.str.startswith,将不匹配的值替换为NaNs 通过Series.where,然后通过按位Series.duplicated链接获取第一个和最后一个值,对于不匹配的行,通过原始反转掩码获取第一个和最后一个值:|ORmask

mask = df['Event'].str.startswith('Type 2')

s = df['ID'].where(mask)
df1 = df[~s.duplicated() | ~s.duplicated(keep='last') | ~mask]
print (df1)
        Event  Start Time  ID
0  Type 1 - A  2020-02-03   1
1  Type 1 - B  2020-02-04   1
2  Type 2 - A  2020-02-05   1
3  Type 1 - C  2020-02-06   1
5  Type 2 - C  2020-02-08   1
6  Type 1 - D  2020-02-09   1
7  Type 1 - A  2020-02-03   2

推荐阅读