首页 > 解决方案 > 比较 2 个连续行并检查日期差异是否在范围内

问题描述

我有数据框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。我已经尝试比较 2 个连续的行,如果不同(使用 Pandas)分配增加的值 但是,答案是解决不同的问题。

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

标签: pythonpandasdataframerows

解决方案


利用:

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

推荐阅读