Манипулирование колоннами панд - PullRequest
0 голосов
/ 03 июня 2019

У меня есть некоторые данные (до Event) и ожидаемый результат (Key, Time) следующим образом:

+----------+------------+-------+-----+------+
| Location |    Date    | Event | Key | Time |
+----------+------------+-------+-----+------+
| i2       | 2019-03-02 |     1 | a   |      |
| i2       | 2019-03-02 |     1 | a   |      |
| i2       | 2019-03-02 |     1 | a   |      |
| i2       | 2019-03-04 |     1 | a   |    2 |
| i2       | 2019-03-15 |     2 | b   |    0 |
| i9       | 2019-02-22 |     2 | c   |    0 |
| i9       | 2019-03-10 |     3 | d   |      |
| i9       | 2019-03-10 |     3 | d   |    0 |
| s8       | 2019-04-22 |     1 | e   |      |
| s8       | 2019-04-25 |     1 | e   |      |
| s8       | 2019-04-28 |     1 | e   |    6 |
| t14      | 2019-05-13 |     3 | f   |      |
+----------+------------+-------+-----+------+

Всякий раз, когда Location или Event (или оба) изменяется, создается новый Key. В основном меня интересует вывод Time, который представляет собой разницу в днях между первой и последней строкой каждого Key. Если в Key есть одна строка, то Time равен 0. Нам все еще нужно создать Key или мы можем напрямую получить разрыв Time?

Ответы [ 2 ]

4 голосов
/ 03 июня 2019

Я не думаю, что вам нужно создать Key здесь

df['Time']=df.groupby(['Location','Event']).Date.\
                  transform(lambda x : (x.iloc[-1]-x.iloc[0]))[~df.duplicated(['Location','Event'],keep='last')]
df
Out[107]: 
   Location       Date Event Key   Time
0        i2 2019-03-02     1   a    NaT
1        i2 2019-03-02     1   a    NaT
2        i2 2019-03-02     1   a    NaT
3        i2 2019-03-04     1   a 2 days
4        i2 2019-03-15     2   b 0 days
5        i9 2019-02-22     2   c 0 days
6        i9 2019-03-10     3   d    NaT
7        i9 2019-03-10     3   d 0 days
8        s8 2019-04-22     1   e    NaT
9        s8 2019-04-25     1   e    NaT
10       s8 2019-04-28     1   e 6 days
11      t14 2019-05-13     3   f 0 days
0 голосов
/ 03 июня 2019

Векторизованный подход

df['Date'] = pd.to_datetime(df['Date'])
df['diff'] = df['Key'].ne(df['Key'].shift(-1).ffill()).astype(int)
x = df.groupby(['Location','Event'])['Date'].transform(np.ptp)
df.loc[df['diff'] == 1, 'date_diff'] = x
df

Location    Date    Event   Key Time    diff    date_diff
1   i2  2019-03-02  1   a       0   NaT
2   i2  2019-03-02  1   a       0   NaT
3   i2  2019-03-02  1   a       0   NaT
4   i2  2019-03-04  1   a   2   1   2 days
5   i2  2019-03-15  2   b   0   1   0 days
6   i9  2019-02-22  2   c   0   1   0 days
7   i9  2019-03-10  3   d       0   NaT
8   i9  2019-03-10  3   d   0   1   0 days
9   s8  2019-04-22  1   e       0   NaT
10  s8  2019-04-25  1   e       0   NaT
11  s8  2019-04-28  1   e   6   1   6 days
12  t14 2019-05-13  3   f       0   NaT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...