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

Я новичок в Python, и теперь у меня есть фрейм данных (с именем df), отсортированный по идентификатору, id_number и contract_year_month в таком порядке:

**identifier id_number contract_year_month collection_year_month**
   K001        1         2018-01-03           2018-01-09
   K001        1         2018-01-08           2018-01-10
   K001        2         2018-01-01           2018-01-05
   K001        2         2018-01-15           2018-01-18
   K002        4         2018-01-04           2018-01-07
   K002        4         2018-01-09           2018-01-15

и хотел бы добавить столбец с именем «date_difference», который состоит из contract_year_month минус collection_year_month из предыдущей строки на основе идентификатора и id_number (например, 2018-01-08 минус 2018-01-09), так что df будет:

**identifier id_number contract_year_month collection_year_month date_difference**
   K001        1         2018-01-03           2018-01-09            
   K001        1         2018-01-08           2018-01-10           -1
   K001        2         2018-01-01           2018-01-05
   K001        2         2018-01-15           2018-01-18           10
   K002        4         2018-01-04           2018-01-07
   K002        4         2018-01-09           2018-01-15            2

Я уже преобразовал тип столбцов contract_year_month и collection_year_month в datetime и попытался работать с простой функцией shift или iloc, но ни один из них не работает.

df["date_difference"] = df.groupby(["identifier", "id_number"])["contract_year_month"]

Есть ли способ использовать groupby для получения разницы между текущим значением строки и предыдущим значением строки в другом столбце, разделенных двумя идентификаторами? (Я искал час, но не смог найти подсказки ...) Буду искренне признателен, если вы, ребята, дадите несколько советов.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Вот один из подходов, использующий ваше grouby() ( Обновлено на основе отзывов @piRSquared):

In []:
(df['collection_year_month']
 .groupby([df['identifier'], df['id_number']])
 .shift() - df['contract_year_month']).dt.days

Out[]:
0     NaN
1    -1.0
2     NaN
3    10.0
4     NaN
5     2.0
dtype: float64

Вы можете просто присвоить это df['date_difference']

0 голосов
/ 05 сентября 2018

Вот один из возможных способов сделать это.

Сначала создайте логическую маску, затем используйте numpy.where и Series.shift, чтобы создать столбец date_difference:

mask = df.duplicated(['identifier', 'id_number'])

df['date_difference'] = (np.where(mask, (df['contract_year_month'] - 
                                         df['collection_year_month'].shift(1)).dt.days, np.nan))

[выход]

    identifier  id_number   contract_year_month collection_year_month   date_difference
0   K001    1   2018-01-03  2018-01-09  NaN
1   K001    1   2018-01-08  2018-01-10  -1.0
2   K001    2   2018-01-01  2018-01-05  NaN
3   K001    2   2018-01-15  2018-01-18  10.0
4   K002    4   2018-01-04  2018-01-07  NaN
5   K002    4   2018-01-09  2018-01-15  2.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...