【问题标题】:How to delete sequence of rows with same value with a condition?如何使用条件删除具有相同值的行序列?
【发布时间】:2021-12-26 02:08:41
【问题描述】:

我有以下数据框:

. 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

如果结果列中的最后一个“是”,我想删除所有“是”行。

如果它们是数据框中的第一个值,我也想删除所有“否”

这些必须按“id”列分组
这应该是输出:

. id outcome
3 3 yes
4 3 no
11 6 yes
12 6 yes
13 6 yes
14 6 yes
15 6 yes
16 6 no
17 6 no

目前我已经尝试过:

df = pd.DataFrame(data={
       'id': [3, 3, 3, 3, 3, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6], 
       'outcome': ['no', 'no', 'no', 'yes', 'no', 'no', 'no', 'yes', 'yes', 'no', 'no', 'yes', 'yes', 'yes', 'yes', 'yes', 'no', 'no']
     })

m1 = df.groupby(['id'])['outcome'].head() != 'yes'
df = df.drop(m1[m1].index)
m2 = df.groupby(['id'])['outcome'].tail() != 'no'
df = df.drop(m2[m2].index)

print(df)

如果我在 head()tail() 中添加 1,这只会删除最后一个值,而不是前面的值。有什么建议吗?

【问题讨论】:

    标签: python pandas dataframe numpy time-series


    【解决方案1】:

    您需要计算掩码和切片。 总之,我在这里计算了每个是/否段的排名,以确定它们是初始(= 排名 1)还是最终(= 每组最大排名)。

    o = df['outcome']
    g = df.groupby('id')['outcome']
    m1 = o.ne(g.shift()).groupby(df['id']).cumsum()
    m2 = m1.groupby(df['id']).transform('max')
    df[~((m1.eq(1)&o.eq('no'))|(m1.eq(m2)&o.eq('yes')))]
    

    输出:

        id outcome
    3    3     yes
    4    3      no
    11   6     yes
    12   6     yes
    13   6     yes
    14   6     yes
    15   6     yes
    16   6      no
    17   6      no
    

    注意。切片中使用的最终掩码可以使用布尔算法进行简化,但为了清楚起见,我将其保留为原样

    【讨论】:

    • 您好,感谢您提供的详细信息,所以我重新运行了此程序,并且在“是”结果之后它不会保留所有以下“否”值。例如,“是”之后可能有多个“否”。
    • 你能提供一个更新的例子吗?
    • @TSRAI 我很困惑,当我运行我的代码时,这会给出预期的输出(我根据你的新 df 更新了输出)
    • 抱歉,我查看了更新的 df!
    • 不用担心,很高兴它成功了 ;)
    猜你喜欢
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2022-12-17
    • 2011-09-15
    • 2017-11-07
    • 2022-08-11
    相关资源
    最近更新 更多