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

Я хочу создать новый столбец в кадре данных pandas на основе значений, найденных в предыдущей строке.

В частности, я хочу добавить столбец с разницей в днях между датой, найденной в фактической строке, и датой, найденной в последней, среди предыдущих строк, с тем же идентификатором пользователя и количеством> 0.

У меня есть это:

+--------+------------+-----------+
| UserId |    Date    |    Amount |
+--------+------------+-----------+
|      1 | 2017-01-01 |         0 |
|      1 | 2017-01-03 |        10 |
|      2 | 2017-01-04 |        20 |
|      2 | 2017-01-07 |        15 |
|      1 | 2017-01-09 |         7 |
+--------+------------+-----------+

И я хочу это

+--------+------------+-----------+-------------+
| UserId |    Date    |    Amount |  Difference |
+--------+------------+-----------+-------------+
|      1 | 2017-01-01 |         0 |          -1 |
|      1 | 2017-01-03 |        10 |          -1 |
|      2 | 2017-01-04 |        20 |          -1 |
|      2 | 2017-01-07 |        15 |           3 |
|      1 | 2017-01-09 |         7 |           6 |
+--------+------------+-----------+-------------+

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Просто еще один способ обдумать ваш подход:

Сначала преобразуйте столбец Date в дату и время, используя функцию панд to_datetime.

df['Date'] = pd.to_datetime(df['Date'])

Теперь возьмите разницу по дням, используя groupby, который покажет значения разности и отдыха, которые будут получены как NaN

df['Difference'] = df[df['Amount'] > 0].groupby(['UserId'])['Date'].diff().dt.days

df
   UserId       Date  Amount  Difference
0       1 2017-01-01       0         NaN
1       1 2017-01-03      10         NaN
2       2 2017-01-04      20         NaN
3       2 2017-01-07      15         3.0
4       2 2017-01-09       7         2.0

Теперь, наконец, заполните все поля NaN's до -1 в столбце DataFrames Difference.

df['Difference'] = df['Difference'].fillna("-1")
# df = df.fillna("-1") <-- this do the Job but in case you have NaNs in other location in df it will also replace them as `-1`

Результат:

df
   UserId       Date  Amount Difference
0       1 2017-01-01       0         -1
1       1 2017-01-03      10         -1
2       2 2017-01-04      20         -1
3       2 2017-01-07      15          3
4       2 2017-01-09       7          2
0 голосов
/ 13 ноября 2018

Вы были действительно близко;Я просто немного изменил ваш код.

"""
UserId     Date        Amount 
1  2017-01-01          0 
1  2017-01-03         10 
2  2017-01-04         20 
2  2017-01-07         15 
1  2017-01-09          7 
"""
import pandas as pd
df = pd.read_clipboard(parse_dates=["Date"])

df['difference'] = df[df['Amount'] > 0].groupby(['UserId'])['Date'].diff().dt.days.fillna(-1)
df.loc[0, "difference"] = -1
df

Вывод:

   UserId       Date  Amount  difference
0       1 2017-01-01       0        -1.0
1       1 2017-01-03      10        -1.0
2       2 2017-01-04      20        -1.0
3       2 2017-01-07      15         3.0
4       1 2017-01-09       7         6.0

Справка из: Python: преобразование timedelta в int в кадре данных

Очевидно, я вручную изменил первый ряд;как остальная часть вашего df встряхивается при использовании этого кода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...