Вот способ сделать это. Допустим, у вас есть следующий фрейм данных:
date user movie
0 2018-01-02 Alicia Titanic
1 2018-01-13 John Titanic
2 2018-01-22 John Titanic
3 2018-04-02 John Avatar
4 2018-04-05 Alicia Avatar
5 2018-05-19 John Avatar
IIUC правильное решение не должно содержать строку 3, поскольку Alicia
еще не видел Avatar
. Таким образом, вы можете сделать:
df[df.user.eq('Alicia').groupby(df.movie).cumsum()]
date user movie
0 2018-01-02 Alicia Titanic
1 2018-01-13 John Titanic
2 2018-01-22 John Titanic
4 2018-04-05 Alicia Avatar
5 2018-05-19 John Avatar
Объяснение:
Следующее возвращает True
, где user
равно Alicia
:
df.user.eq('Alicia')
0 True
1 False
2 False
3 False
4 True
5 False
Name: user, dtype: bool
Теперь вы можете сделать GroupBy
фильмы и применить cumsum
к группам, поэтому только строки после первого True
будут также стать True
:
0 True
1 True
2 True
3 False
4 True
5 True
Name: user, dtype: bool
Наконец, используйте boolean indexation
на исходном кадре данных, чтобы выбрать интересующие строки.
Я должен был сделать это также и выглядел твердым и глубоким в том, мог ли DataGrid сделать это.
СУЩЕСТВУЕТ на самом деле соответствующий метод на классе DataGridColumnHeader, а именно, InvokeProcessSort, но это является внутренним и не появилось где-либо еще в классах DataGrid.
Все, что я смог сделать, является предварительным видом данные непосредственно перед тем, как я связываю его. Я использую пользовательский сбор данных, который реализует ICollectionView, а также ObservableCollection <>, и это работает хорошо - но это не оптимально, и загрузка работы, это не обязательно необходимо.
Кроме того, обеспечение предварительно отсортированного набора означает, что сетка не показывает маркер вида.
Я повышу это как проблему о средстве отслеживания ошибки DataGrid - это - довольно основной пропуск, который это было бы довольно легко зафиксировать - MS просто должен выставить соответствующие методы на классах DataGridColumn и DataGrid.