Сравните 2 последовательные строки и проверьте, находится ли разница дат в пределах диапазона - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть фрейм данных 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

Я хочу получить столбец «Выбрано» = Y, если для последовательных строк A и B совпадают, а SortedDate находится в пределах 2 месяцев. Я попытался сравнить 2 последовательных строки и назначить возрастающее значение, если оно отличается (используя Pandas) Однако ответ касается разных проблем.

Могу ли я предложить чистый способ достичь этой цели?

1 Ответ

1 голос
/ 21 апреля 2020

Использование:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...