Как создать столбец возрастающих значений на основе уникальных значений в другом столбце в pandas - PullRequest
0 голосов
/ 27 марта 2020

У меня есть набор данных, в котором каждая строка представляет собой образец, а столбец (имя "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

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Используйте groupby для получения каждого номера группы, а затем примените форматирование строки, например:

df1['Sample_code'] = df1.groupby('Sample_ID').ngroup().add(1).apply('SAMP{:03}'.format)
1 голос
/ 27 марта 2020

Вы можете создать таблицу поиска, перебирая уникальные значения и затем применяя ее к новому столбцу:

lookup = {}
for i, sample_name in enumerate(df.Sample_ID.unique()):
    lookup[sample_name] = f'SAMP{i:03}'

df['Sample_code'] = df.Sample_ID.apply(lambda x: lookup[x])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...