Индекс уникальности по группам в пандах - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть датафрейм, который в основном выглядит так:

A=pd.DataFrame({'Id':[1,1,1,1,2,2,2],'Time'[0,0.5,1.2,1.2,0.2,0.2,0.5]})
idx Id  Time
0   1   0.0
1   1   0.5
2   1   1.2
3   1   1.2
4   2   0.2
5   2   0.2
6   2   0.5
7   3   1.7

и я хотел бы назначить индекс упорядочения по времени различным значениям времени для каждого идентификатора . Таким образом, в основном эти столбцы должны отдавать порядок значения времени для этого конкретного идентификатора. Кроме того, записи с одинаковым Id и одинаковым временем должны иметь одинаковый индекс упорядочения. Я должен тогда иметь:

idx Id  Time Time_order
0   1   0.0  0
1   1   0.5  1
2   1   1.2  2
3   1   1.2  2
4   2   0.2  0
5   2   0.2  0
6   2   0.5  1
7   3   1.7  0

Как я могу сделать это эффективно без циклов for? Большое спасибо.

1 Ответ

0 голосов
/ 07 сентября 2018

groupby с rank с использованием method='dense'

A.assign(Time_order=A.groupby('Id').Time.rank(method='dense') - 1)

   idx  Id  Time  Time_order
0    0   1   0.0         0.0
1    1   1   0.5         1.0
2    2   1   1.2         2.0
3    3   1   1.2         2.0
4    4   2   0.2         0.0
5    5   2   0.2         0.0
6    6   2   0.5         1.0
7    7   3   1.7         0.0

astype(int) если вы действительно хотите

A.assign(Time_order=A.groupby('Id').Time.rank(method='dense').astype(int) - 1)

   idx  Id  Time  Time_order
0    0   1   0.0           0
1    1   1   0.5           1
2    2   1   1.2           2
3    3   1   1.2           2
4    4   2   0.2           0
5    5   2   0.2           0
6    6   2   0.5           1
7    7   3   1.7           0

pd.factorize

A.assign(Time_order=A.groupby('Id').Time.transform(lambda x: pd.factorize(x, sort=True)[0]))

   idx  Id  Time  Time_order
0    0   1   0.0         0.0
1    1   1   0.5         1.0
2    2   1   1.2         2.0
3    3   1   1.2         2.0
4    4   2   0.2         0.0
5    5   2   0.2         0.0
6    6   2   0.5         1.0
7    7   3   1.7         0.0
...