Pandas: Groupby, l oop и добавить один час итерации с условиями внутри группы - PullRequest
3 голосов
/ 10 июля 2020

У меня есть df, как показано ниже, есть несколько повторяющихся записей даты для каждого человека, я sh, чтобы сохранить точно такую ​​же последовательность / порядок для остальных данных, но sh, чтобы добавить один час для только дублирующая запись даты.

df = pd.DataFrame({
    'name': ['Jim', 'Jim', 'Jim', 'Jim', 'Mike', 'Mike', 'Mike', 'Mike',
           'Polo', 'Polo', 'Polo', 'Polo', 'Polo', 'Tom', 'Tom', 'Tom', 'Tom'],
    'Item ID': [80, 68, 751, 'Started', 32, 126, 68,  'Started', 105, 68, 251, 76, 'Started', 82, 251, 23, "Started"],
    'Date':["2018-02-15", "2018-02-14", "2015-08-17", "2015-08-17",
            "2018-09-14", "2018-06-01", "2018-06-01", "2018-05-31",
            "2017-06-01", "2017-06-01", "2014-12-01", "2014-11-23", "2013-08-11",
            "2017-07-14", "2016-02-16", "2016-02-16", "2015-06-05"],
})

    name  Item ID        Date
0    Jim       80  2018-02-15
1    Jim       68  2018-02-14
2    Jim      751  2015-08-17 # duplicate date for Jim, add one hour here
3    Jim  Started  2015-08-17
4   Mike       32  2018-09-14
5   Mike      126  2018-06-01 # duplicate date for Mike, add one hour here
6   Mike       68  2018-06-01
7   Mike  Started  2018-05-31
8   Polo      105  2017-06-01 # duplicate date for Polo, add one hour here
9   Polo       68  2017-06-01
10  Polo      251  2014-12-01
11  Polo       76  2014-11-23
12  Polo  Started  2013-08-11
13   Tom       82  2017-07-14
14   Tom      251  2016-02-16 # duplicate date for Tom, add one hour here
15   Tom       23  2016-02-16
16   Tom  Started  2015-06-05

Я написал несколько кодов, но работал плохо и очень непродуктивно. Если у кого-то были идеи, пожалуйста, помогите, большое спасибо. Мой ожидаемый результат:

    name  Item ID                 Date
0    Jim       80           2018-02-15
1    Jim       68           2018-02-14
2    Jim      751         2015-08-17 00:01:00 # added
3    Jim  Started           2015-08-17
4   Mike       32           2018-09-14
5   Mike      126         2018-06-01 00:01:00 # added
6   Mike       68           2018-06-01
7   Mike  Started           2018-05-31
8   Polo      105         2017-06-01 00:01:00 # added
9   Polo       68           2017-06-01
10  Polo      251           2014-12-01
11  Polo       76           2014-11-23
12  Polo  Started           2013-08-11
13   Tom       82           2017-07-14
14   Tom      251         2016-02-16 00:01:00 # added
15   Tom       23           2016-02-16
16   Tom  Started           2015-06-05

Ответы [ 2 ]

4 голосов
/ 10 июля 2020

Мы можем сделать duplicated с обратным порядком на iloc, а затем добавить час к исходной дате

df.Date=pd.to_datetime(df.Date)+pd.to_timedelta(df.iloc[::-1].duplicated(['name','Date']).astype(int),unit='hour')
df
    name  Item ID                Date
0    Jim       80 2018-02-15 00:00:00
1    Jim       68 2018-02-14 00:00:00
2    Jim      751 2015-08-17 01:00:00
3    Jim  Started 2015-08-17 00:00:00
4   Mike       32 2018-09-14 00:00:00
5   Mike      126 2018-06-01 01:00:00
6   Mike       68 2018-06-01 00:00:00
7   Mike  Started 2018-05-31 00:00:00
8   Polo      105 2017-06-01 01:00:00
9   Polo       68 2017-06-01 00:00:00
10  Polo      251 2014-12-01 00:00:00
11  Polo       76 2014-11-23 00:00:00
12  Polo  Started 2013-08-11 00:00:00
13   Tom       82 2017-07-14 00:00:00
14   Tom      251 2016-02-16 01:00:00
15   Tom       23 2016-02-16 00:00:00
16   Tom  Started 2015-06-05 00:00:00
2 голосов
/ 10 июля 2020
df['Date'] = pd.to_datetime(df['Date'])
df.loc[df.duplicated(subset=['name','Date'], keep='last'), 'Date'] = df['Date'] + pd.DateOffset(hours=1)

Вывод

    name     Item ID                  Date
0   Jim      80        2018-02-15 00:00:00
1   Jim      68        2018-02-14 00:00:00
2   Jim      751       2015-08-17 01:00:00
3   Jim  Started       2015-08-17 00:00:00
4   Mike     32        2018-09-14 00:00:00
5   Mike    126        2018-06-01 01:00:00
6   Mike     68        2018-06-01 00:00:00
7   Mike Started       2018-05-31 00:00:00
8   Polo    105        2017-06-01 01:00:00
9   Polo     68        2017-06-01 00:00:00
10  Polo    251        2014-12-01 00:00:00
11  Polo     76        2014-11-23 00:00:00
12  Polo    Started    2013-08-11 00:00:00
13  Tom      82        2017-07-14 00:00:00
14  Tom     251        2016-02-16 01:00:00
15  Tom      23        2016-02-16 00:00:00
16  Tom Started        2015-06-05 00:00:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...