Последние значения основаны на столбце времени - PullRequest
1 голос
/ 04 марта 2020

У меня есть mydf ниже, который я отсортировал по пустому столбцу time и id:

mydf = pd.DataFrame(
    {
        'id': ['A', 'B', 'B', 'C', 'A', 'C', 'A'],
        'time': [1, 4, 3, 5, 2, 6, 7],
        'val': ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    }
).sort_values(['id', 'time'], ascending=False)

mydf
    id  time    val
5   C   6       f
3   C   5       d
1   B   4       b
2   B   3       c
6   A   7       g
4   A   2       e
0   A   1       a

Я хочу добавить столбец (last_val), который для каждый уникальный id содержит самый последний val на основе столбца time. Записи, для которых нет last_val, могут быть удалены. Вывод в этом примере будет выглядеть так:

mydf
    id  time    val last_val
5   C   6       f   d
1   B   4       b   c
6   A   7       g   e
4   A   2       e   a 

Есть идеи?

1 Ответ

2 голосов
/ 04 марта 2020

Используйте DataFrameGroupBy.shift после sort_values(['id', 'time'], ascending=False) (уже в вопросе), а затем удалите строки с пропущенными значениями на DataFrame.dropna:

mydf['last_val'] = mydf.groupby('id')['val'].shift(-1)
mydf = mydf.dropna(subset=['last_val'])

Аналог решение, только последние дублированные строки удалены по столбцу id:

mydf['last_val'] = mydf.groupby('id')['val'].shift(-1)
mydf = mydf[mydf['id'].duplicated(keep='last')]

print (mydf)
  id  time val last_val
5  C     6   f        d
1  B     4   b        c
6  A     7   g        e
4  A     2   e        a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...