Я хочу индексировать следующий фрейм данных pandas со следующими значениями образца. В DataFrame много дубликатов.
ID AccountName
83 CHRISTIAN UNIVERSITY
83 CHRISTIAN UNIVERSITY
83 CHRISTIAN UNIVERSITY
83 CHRISTIAN UNIVERSITY
104 UNIVERSITY
104 UNIVERSITY
1740 ELECTRIC CORPORATIO
1740 ELECTRIC CORPORATIO
1740 ELECTRIC CORPORATIO
1740 ELECTRIC CORPORATIO
...
Результирующий фрейм должен быть следующим.
ID index AccountName
83 1 CHRISTIAN UNIVERSITY
83 1 CHRISTIAN UNIVERSITY
83 1 CHRISTIAN UNIVERSITY
83 1 CHRISTIAN UNIVERSITY
104 2 UNIVERSITY
104 2 UNIVERSITY
1740 3 ELECTRIC CORPORATIO
1740 3 ELECTRIC CORPORATIO
1740 3 ELECTRIC CORPORATIO
1740 3 ELECTRIC CORPORATIO
...
У кого-нибудь есть быстрый и эффективный способ сделать это?
Предполагая, что вы хотите увеличивать индекс для каждого нового идентификатора, я бы сделал:
In [43]: df["number"] = df.ID.rank(method='dense').astype(int)
In [44]: df
Out[44]:
ID AccountName number
0 83 CHRISTIAN UNIVERSITY 1
1 83 CHRISTIAN UNIVERSITY 1
2 83 CHRISTIAN UNIVERSITY 1
3 83 CHRISTIAN UNIVERSITY 1
4 104 UNIVERSITY 2
5 104 UNIVERSITY 2
6 1740 ELECTRIC CORPORATIO 3
7 1740 ELECTRIC CORPORATIO 3
8 1740 ELECTRIC CORPORATIO 3
9 1740 ELECTRIC CORPORATIO 3
который даст самый низкий идентификатор номер 1, а второй самый низкий 2 и т.д., независимо от порядка, который они фактически появляются в кадре (например, если вы поместите ELECTRIC_CORPORATIO во второй раз, он все равно получит № 3, потому что 1740 является третьим номером.)
Существуют и другие способы, если вы можете быть уверены, что ваши кластеры смежны, например
(~df["ID"].duplicated()).cumsum()
но гораздо менее надежный, чем сопоставление уникального идентификатора с уникальным номером, ИМХО.
Кроме того, я использовал "число" здесь как имя столбца, а не "индекс", потому что это вызывает путаницу между индексом кадра и вашим столбцом с именем "index".