【问题标题】:Finding consecutive days in the pandas dataframe在 pandas 数据框中查找连续天数
【发布时间】:2020-01-29 11:00:42
【问题描述】:

我有一个数据框:

  ColA  ColB

0   A    1/2/2020 
1   A    1/3/2020       
2   A    1/4/2020
3   A    1/10/2020 
4   B    1/3/2020
5   B    1/19/2020
6   C    1/2/2020
7   C    1/7/2020 
8   D    1/8/2020

现在我想在colA 中找出连续三天在colB 中的系列名称。

输出:

答案是A,因为它在colB 中有1/2/20201/3/20201/4/2020

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    一般的做法是这样的:

    # 1. To make sure the dates are sorted
    df = df.sort_values(["ColA", "ColB"])
    
    # 2. Standardize the dates by offseting them
    df["ColB_std"] = df["ColB"] - pd.to_timedelta(range(df.shape[0]), 'day')
    
    # 3. Counting each instance of ColA and standardized date
    s = df.groupby(["ColA", "ColB_std"])["ColB_std"].count()
    
    # 4. Getting elements from ColA that have at least 1 sequence of at least length 3
    colA = s[ s >= 3 ].index.get_level_values(0).unique().values
    
    # 5. Filtering the dataframe
    df[ df["ColA"].isin(colA) ]
    

    您希望 ColAs 有 3 个连续日期。或者你可以像你想要的ColAs 那样想它,其中有datedate + 1 daydate + 2 days 的序列。通过按照 ColA 和 ColB (1) 对数据框进行排序,我们知道在您要检查的情况下,date + 1 day 将始终跟随 date,而 date + 2 days 将是以下那个.

    这样,您可以通过删除与行对应的n 天来标准化日期。因此,datedate + 1 daydate + 2 days 的序列变为 datedatedate(2)

    现在我们已经标准化了日期列,我们只需要计算每对 ('ColA', 'ColB_std') 存在多少个元素(3),从 ColA 中获取计数为 3 或更多(4),并过滤数据框(5)

    但是,这不支持重复的 ('ColA', 'ColB') 对,因为您需要先执行此操作:

    df2 = df.drop_duplicates(["ColA", "ColB"])
    

    在步骤 1、2、3 和 4 中继续使用这个 df2,最后在步骤 5 中过滤真正的 df

    之前我回答说你也可以这样做

    # To make sure the dates are sorted
    df = df.sort_values(["ColA", "ColB"])
    
    # Calculating the difference between dates inside each group
    s = df.groupby("ColA")["ColB"].diff().dt.days
    
    # Filtering the dataframe
    df[ ((s == 1) & (s.shift(1) == 1)).groupby(df["ColA"]).transform("any") ]
    

    这个想法是,在s 中,差异总是在前一个日期和当前日期之间。但是,这并不能确保有 3 个连续日期,只有 2 个。通过将系列移动 1,您可以确保当前不同的日期和前一个日期是 1 [(s == 1) & (s.shift(1) == 1)]。

    之后,我只需要groupby(df["ColA"]),然后使用transform("any") 检查组内的任何元素是否为真。

    【讨论】:

    • 我收到此错误 - ufunc 减法不能使用 dtype('
    • 您能否验证当您打印 df.dtypes 时,ColB 的类型为 datetime64[ns]?如果是这种情况,您能否在评论或在线 IDE(如 repl.it)中向我提供您的错误示例?
    • 你能解释一下第三步吗?
    • 这是一张图片,除了答案中的解释外,它可能会有所帮助:imgur.com/BefUOub
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2019-03-28
    • 2017-01-31
    • 2021-12-20
    • 2021-09-23
    相关资源
    最近更新 更多