Удалите первое значение в разделе данных в кадре данных, переиндексируйте и создайте новый столбец - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть таблица со следующими столбцами данных

+------+--------+------------+---+---+---+
| area | locale |    date    | i | t | o |
+------+--------+------------+---+---+---+
| abc  | abc25  | 2001-03-01 | 1 |   |   |
| abc  | abc25  | 2001-04-01 |   | 1 |   |
| abc  | abc25  | 2001-05-01 | 1 |   |   |
| abc  | abc25  | 2001-06-01 |   | 1 |   |
| abc  | abc25  | 2001-07-01 |   |   | 1 |
| def  | def12  | 2001-03-01 |   | 1 |   |
| def  | def12  | 2001-04-01 |   | 1 |   |
| def  | def12  | 2001-05-01 | 1 |   |   |
| def  | def12  | 2001-06-01 |   |   | 1 |
| def  | def12  | 2001-07-01 |   |   | 1 |
+------+--------+------------+---+---+---+

Пример вывода:

+------+--------+------------+------------+---+---+---+
| area | locale |    date    |  end date  | i | t | o |
+------+--------+------------+------------+---+---+---+
| abc  | abc25  | 2001-03-01 | 2001-04-01 | 1 |   |   |
| abc  | abc25  | 2001-04-01 | 2001-05-01 |   | 1 |   |
| abc  | abc25  | 2001-05-01 | 2001-06-01 | 1 |   |   |
| abc  | abc25  | 2001-06-01 | 2001-07-01 |   | 1 |   |
| abc  | abc25  | 2001-07-01 |            |   |   | 1 |
| def  | def25  | 2001-03-01 | 2001-04-01 |   | 1 |   |
| def  | def25  | 2001-04-01 | 2001-05-01 |   | 1 |   |
| def  | def25  | 2001-05-01 | 2001-06-01 | 1 |   |   |
| def  | def25  | 2001-06-01 | 2001-07-01 |   |   | 1 |
| def  | def25  | 2001-07-01 |            |   |   | 1 |
+------+--------+------------+------------+---+---+---+

Что мне нужно сделать, это сделать набор столбцов из одного столбца.Технически дата сама по себе является «датой начала», поэтому я могу просто переименовать ее.Это легкая часть.Часть, с которой мне трудно работать, находится в каждой области / локали, в которой мне нужно создать «дату окончания».Эта конечная дата является просто следующей датой в строке в этом разделе, если только ее нет, и тогда это будет просто Нет или это может быть та же дата, например, EG.2001-07-01.

Есть ли способ достичь этого в пандах?

Я пробовал

df['end_date'] = df.groupby('date').Date.apply(lambda x: x.shift(-1).reset_index(0)['locale'])

, но это не нравится.выдает ошибку «Объект DataFrameGroupBy» не имеет атрибута «Дата»

1 Ответ

0 голосов
/ 05 декабря 2018

Вы можете groupby на area и shift

df['end date'] = df.groupby('area')['date'].shift(-1)

print (df)

    area    locale          date    i    t    o      end date
0   abc     abc25     2001-03-01    1              2001-04-01 
1   abc     abc25     2001-04-01         1         2001-05-01 
2   abc     abc25     2001-05-01    1              2001-06-01 
3   abc     abc25     2001-06-01         1         2001-07-01 
4   abc     abc25     2001-07-01              1           NaN
5   def     def12     2001-03-01         1         2001-04-01 
6   def     def12     2001-04-01         1         2001-05-01 
7   def     def12     2001-05-01    1              2001-06-01 
8   def     def12     2001-06-01              1    2001-07-01 
9   def     def12     2001-07-01              1           NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...