【问题标题】:Condition on all rows of a groupbygroupby 的所有行的条件
【发布时间】:2021-11-08 16:18:02
【问题描述】:

关于这种类型的数据框:

import pandas as pd
import datetime
df = pd.DataFrame({'ID': [1,1,1,1,2,2,2,3],
                   'Time': [datetime.date(2019, 12, 1), datetime.date(2019, 12, 5),datetime.date(2019, 12, 8),datetime.date(2019, 8, 4),datetime.date(2019, 11, 4),datetime.date(2019, 11, 4),datetime.date(2019, 11, 3),datetime.date(2019, 12, 20)],
                   'Value':[2,2,2,50,7,100,7,5]})
    ID  Time        Value
0   1   2019-12-01  2
1   1   2019-12-05  2
2   1   2019-12-08  2
3   1   2019-08-04  50
4   2   2019-11-04  7
5   2   2019-11-04  100
6   2   2019-11-03  7
7   3   2019-12-20  5

我只对最新的 3 个值感兴趣(关于时间)

我只想保留这 3 个值

所以我想要的输出将如下所示:

    ID
0   1

确实,第一个 ID 的值 50 是倒数第四个值,所以它并不有趣。

【问题讨论】:

    标签: python pandas dataframe pandas-groupby apply


    【解决方案1】:

    在groupby内:

    • 我按时间对组进行排序
    • 使用布尔值确定条件
    • 只取最后 3 个值并将上面定义的布尔值求和
    • 检查这个数字是否正好是 3
    grp = df.groupby("ID")\
            .apply(lambda x: 
             x.sort_values("Time")["Value"].lt(10)[-3:].sum()==3)
    
    grp[grp]
    
    ID
    1    True
    dtype: bool
    

    【讨论】:

      【解决方案2】:

      您可以使用querygroupby+size 的组合:

      ids = df.query('Value < 10').groupby('ID')['Time'].size().ge(3)
      ids[ids].reset_index().drop('Time', axis=1)
      

      输出:

         ID
      0   1
      

      替代使用filter(较慢):

      df.groupby('ID').filter(lambda g: len(g[g['Value'].lt(10)]['Time'].nlargest(3))>2)
      

      输出:

         ID       Time  Value
      0   1 2019-12-01      2
      1   1 2019-12-05      2
      2   1 2019-12-08      2
      3   1 2019-08-04     50
      

      并且只获取 ID:添加 ['ID'].unique()

      【讨论】:

      • 是我错了还是在尽可能多地返回错误结果之前进行过滤?
      • 我把这个问题理解为我们需要至少 3 个低于 10 的值,如果这不正确,那么在不同的条件下使用相同的逻辑很容易跨度>
      • 确实@rpanai,我们只想查看最新的 3 个值,因此如果您在这种情况下删除这些值,它将无法正常工作......但现在感谢您的帮助!跨度>
      • @mozway 在 OP 上写着3 latest values。我也很困惑。
      • ok,那么这两个条件需要交换一下(先取最新的3个,然后去掉值,最后计数),但整体逻辑是类似的;)
      猜你喜欢
      • 1970-01-01
      • 2017-01-11
      • 2020-07-15
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2021-04-06
      相关资源
      最近更新 更多