У меня есть набор данных, в котором каждая строка представляет собой образец, а столбец (имя "Sample_ID") называет каждый образец (df1 ниже). Некоторые сэмплы повторяются несколько раз (т.е. имеют идентичные значения для «Sample_ID»). Я хотел бы создать новый столбец с разными именами для каждого образца (назову его «Sample_code») на основе простого восходящего шаблона (например, SAMP001, SAMP002, SAMP003 и т. Д. c) от первой строки до последней строки в таблице. Но строки с одинаковыми идентификаторами Sample_ID также должны иметь одинаковые значения Sample_code (поэтому я не могу просто создать восходящий набор имен образцов для нового столбца).
В приведенных ниже примерах df1 представляет мои начальные данные , df2 - это то, чем я хочу закончить: значения столбца Sample_code возрастают, когда вы go внизу каждой строки, но с тем же значением для строк, где дублируется Sample_ID.
Я довольно озадачен, где начать, поэтому любая помощь будет высоко ценится, спасибо.
import numpy as np
import pandas as pd
# df1
data1 = {'Sample_ID': ['123123','123456','123123','123789','456789', '123654'],
'Variable_A': [15,12,7,19,3,12],
'Variable_B':["blue","red","red","blue","blue", "red"]}
df1 = pd.DataFrame(data1)
# df2
data2 = {'Sample_ID': ['123123','123456','123123','123789','456789', '123654'],
'Sample_code' : ['SAMP001', 'SAMP002', 'SAMP001', 'SAMP003', 'SAMP004', 'SAMP005'],
'Variable_A': [15,12,7,19,3,12],
'Variable_B':["blue","red","red","blue","blue", "red"]}
df2 = pd.DataFrame(data2)
df1
df2
РЕДАКТИРОВАТЬ В идеале я хотел бы, чтобы восходящие имена Sample_code были в исходном порядке строк, как строки в начальном наборе данных упорядочены по дате сбора. Мне бы хотелось, чтобы имена Sample_code основывались на первом появлении определенного образца, когда вы go вниз по строкам. Новый иллюстративный df3 имеет столбец даты, чтобы дать представление о том, что я имею в виду.
# df3
data3 = {'Sample_ID': ['123123','123456','123123','123789','456789',
'123654', '123123', '123789'],
'Date' : ['15/06/2019', '23/06/2019', '30/06/2019', '07/07/2019',
'15/07/2019', '31/07/2019', '12/08/2019', '27/08/2019'],
'Variable_A': [15,12,7,19,3,12,7,9],
'Variable_B':["blue","red","red","blue","blue", "red","blue", "red"]}
df3 = pd.DataFrame(data3)
df3
Предлагаемое ниже решение работает, но оно создает имена Sample_code на основе последней строки, в которой появляются повторяющиеся значения Sample_ID, например, Sample_ID "123123" помечен как "SAMP006" (для последней строки это значение отображается), но я бы хотел, чтобы это значение было "SAMP001" (первая строка, в которой оно появляется).
lookup = {}
for i, sample_name in enumerate(df3.Sample_ID):
lookup[sample_name] = f'SAMP{i:03}'
df3['Sample_code'] = df3.Sample_ID.apply(lambda x: lookup[x])
df3