【问题标题】:Compare 2 consecutive rows and check if date difference is within range比较 2 个连续行并检查日期差异是否在范围内
【发布时间】:2020-04-23 14:18:52
【问题描述】:

我有数据框 df:

    A   B   SortedDate  Selected
0   aa  200 01-Jan-20   Y
1   aa  200 23-Dec-19   Y
2   aa  200 12-Jun-19   N
3   bb  400 13-Mar-20   Y
4   bb  400 02-Feb-20   Y
5   bb  500 15-Mar-20   N
6   cc  700 02-Feb-20   Y
7   cc  700 02-Feb-20   Y
8   cc  900 03-Feb-20   N
9   dd  900 30-Jan-20   N
10  dd  200 30-Jan-20   N

如果连续行 A 和 B 相同并且 SortedDate 在 2 个月内,我想获得列 'Selected'=Y。 我试过Compare 2 consecutive rows and assign increasing value if different (using Pandas) 然而,答案是解决不同的问题。

我可以就实现此目标的干净方法提出建议吗?

【问题讨论】:

    标签: python pandas dataframe rows


    【解决方案1】:

    用途:

    print (df)
         A    B SortedDate Selected
    0   aa  200  01-Jan-20        Y
    1   aa  200  23-Dec-19        Y
    2   aa  200  24-Oct-19        Y <- changed datetime
    3   bb  400  13-Mar-20        Y
    4   bb  400  02-Feb-20        Y
    5   bb  500  15-Mar-20        N
    6   cc  700  02-Feb-20        Y
    7   cc  700  02-Feb-20        Y
    8   cc  900  03-Feb-20        N
    9   dd  900  30-Jan-20        N
    10  dd  200  30-Jan-20        N
    

    #convert column to datetimes
    df['SortedDate'] = pd.to_datetime(df['SortedDate'], format='%d-%b-%y')
    
    #get shifted values and subtract 2 months
    s = (df.groupby(['A','B'])['SortedDate'].shift().fillna(df['SortedDate']) - 
               pd.DateOffset(months=2))
    #chain by bitwise AND (&) only for duplicated groups (lenghts 2 or more)
    mask = df['SortedDate'].gt(s)  & df.duplicated(['A','B'], keep=False)
    #set values by mask
    df['Selected1'] = np.where(mask, 'Y', 'N')
    print (df)
         A    B SortedDate Selected Selected1
    0   aa  200 2020-01-01        Y         Y
    1   aa  200 2019-12-23        Y         Y
    2   aa  200 2019-10-24        N         Y
    3   bb  400 2020-03-13        Y         Y
    4   bb  400 2020-02-02        Y         Y
    5   bb  500 2020-03-15        N         N
    6   cc  700 2020-02-02        Y         Y
    7   cc  700 2020-02-02        Y         Y
    8   cc  900 2020-02-03        N         N
    9   dd  900 2020-01-30        N         N
    10  dd  200 2020-01-30        N         N
    

    【讨论】:

    • 非常感谢@jezrael。它真的解决了我的问题。真的非常感谢!
    • 请问第2行(aa 200 2019-06-12),我把日期改成2019-10-24,Selected1会变成Y还是N?因为根据逻辑,groupby 将只取第一个日期,即 2020-01-01 并抵消 2 个月,即 2019-11-01,它晚于 2019-10-24。按理说应该是 Y。
    • @BrianChew - 我的答案创建 Y 用于日期时间大于第一个日期时间 - 2 个月,因此在第一组中,2020-01-01, 2019-11-01 之间的所有日期时间为 Y,否则为 N。你还需要别的吗?
    • @BrianChew - 此代码仅用于长度为 2 或以上的组,由 ['A','B'] 列重复。所以,第 8,9,10 行总是 N,因为一个元素组。
    • 是的,我不需要将其与第一个日期时间进行比较,而是将其与上一行进行比较。假设我有一个长度为 3 的组。OrderedDate 是 2020-02-01、2020-12-01 和 2020-11-01。我需要它们都是 Y、Y、Y 而不是 Y、Y、N。因为第三个日期在第二个日期后的 2 个月内,尽管距离第一个日期超过 2 个月。
    猜你喜欢
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    相关资源
    最近更新 更多