python - 比较 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)分配增加的值 但是,答案是解决不同的问题。
我可以就实现这一目标的干净方法提出建议吗?
解决方案
利用:
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
推荐阅读
- r - 更新后将数据框从 Rstudio Viewer 复制粘贴到 Excel 无法正常工作
- stripe-payments - 如何在我的 asp.net 网络表单中使用 stripe.redirectToCheckout?
- r - 使用培根分解时必须提供来源
- c - 如何在 C 中包含头文件
- html - 按钮被点击后正在移动
- python - 使用python在同一图中绘制来自不同数据文件的多行
- matlab - 键入变量的第一个字母以快速到达 Matlab 工作区中的那个位置
- firebase - Firebase 云存储:“UploadTask”未定义类
- c# - 无法在 int64 C# 中保存 19 位值
- python - 从字典列表中删除重复值