Используя Python, как я могу взять столбец данных Pandas со значениями и заменить их новой последовательностью значений, допускающей дублирование и порядок. Например, рассмотрим следующие значения:
56-34567
56-25767
56-24777
56-23987
56-23987
56-23987
56-34567
Мне нужно было бы создать что-то вроде:
ID_1
ID_2
ID_3
ID_4
ID_4
ID_4
ID_1
Мне нужно учитывать несколько значений. В моем примере 56-34567 (ID_1) встречается дважды, а 56-23987 (ID_4) — три раза. Список новых значений должен отражать это в правильном порядке. Спасибо, любая помощь приветствуется.
Используйте groupby
и ngroup
, чтобы получить уникальные идентификаторы для каждого текущего идентификатора. Затем вы можете объединить свой префикс (несколько способов сделать это).
df
col
0 56-34567
1 56-25767
2 56-24777
3 56-23987
4 56-23987
5 56-23987
6 56-34567
# df.groupby('col', sort=False).ngroup().add(1).astype(str).radd('ID_')
df.groupby('col', sort=False).ngroup().add(1).map('ID_{}'.format)
0 ID_1
1 ID_2
2 ID_3
3 ID_4
4 ID_4
5 ID_4
6 ID_1
dtype: object
Куда ngroup
возвращается,
df.groupby('col', sort=False).ngroup()
0 0
1 1
2 2
3 3
4 3
5 3
6 0
dtype: int64
Здесь важен вызов sort=False
, потому что мы хотим, чтобы порядок вывода был идентичен входному.
Однако больше вариантов не может гарантировать такой же порядок. Один метод использует pd.factorize
:
np.char.add('ID_', (pd.factorize(df['col'])[0] + 1).astype(str))
# array(['ID_1', 'ID_2', 'ID_3', 'ID_4', 'ID_4', 'ID_4', 'ID_1'],
# dtype='<U24')
Возвращается массив, затем вы можете присвоить результат обратно,
df.assign(col=np.char.add('ID_', (pd.factorize(df['col'])[0] + 1).astype(str)))
col
0 ID_1
1 ID_2
2 ID_3
3 ID_4
4 ID_4
5 ID_4
6 ID_1
... ты волшебник. Большое спасибо!