Создать столбец на основе первой строки каждой отсортированной группы в пандах - PullRequest
1 голос
/ 29 сентября 2019

Я хочу сгруппировать фрейм данных на основе двух столбцов и отсортировать каждую группу на основе другого столбца, а затем создать новый столбец для каждой группы на основе первой строки каждой группы! (Col3 - это дата в моем наборе данных)

dataframe:

col1            col2         col3
A               0            2.0
A               0            1.0
A               0            3.0
A               1            3.0
A               1            4.0
B               0            3.0
B               0            1.0
B               1            1.0
B               1            1.0

вывод:

col1            col2         col3           col4
A               0            2.0        1.0
A               0            1.0        1.0
A               0            3.0        1.0
A               1            3.0        3.0
A               1            4.0        3.0
B               0            3.0        1.0
B               0            1.0        1.0
B               1            0.0        0.0
B               1            1.0        0.0

Я попробовал это:

active_users = active_users.groupby(['col1', 'col2']).apply(lambda x: x.sort_values('col3')).transform('first')

и получил эту ошибку:

TypeError: first() missing 1 required positional argument: 'offset'

1 Ответ

2 голосов
/ 29 сентября 2019

Вы можете создать такой столбец с помощью:

df['col4'] = df.groupby(['col1', 'col2'])['col3'].transform('min')

Поскольку первое значение отсортированных элементов является минимальным.Обычно будет лучше использовать минимум по первому элементу отсортированного списка, так как вычисление минимума может быть сделано в O (n) .Для сортировки это зависит от самого алгоритма, так как существуют ленивые алгоритмы сортировки, которые иногда могут также получить первый элемент в O (n) , но я думаю, 'min' проясняет, к чему вы стремитесьdo.

Для данного образца данных мы получим:

>>> df = pd.DataFrame({'col1': ['A']*5 + ['B']*4, 'col2': [0,0,0,1,1,0,0,1,1], 'col3': [2,1,3,3,4,3,1,0,1.0]})
>>> df
  col1  col2  col3
0    A     0   2.0
1    A     0   1.0
2    A     0   3.0
3    A     1   3.0
4    A     1   4.0
5    B     0   3.0
6    B     0   1.0
7    B     1   0.0
8    B     1   1.0
>>> df['col4'] = df.groupby(['col1', 'col2'])['col3'].transform('min')
>>> df
  col1  col2  col3  col4
0    A     0   2.0   1.0
1    A     0   1.0   1.0
2    A     0   3.0   1.0
3    A     1   3.0   3.0
4    A     1   4.0   3.0
5    B     0   3.0   1.0
6    B     0   1.0   1.0
7    B     1   0.0   0.0
8    B     1   1.0   0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...