如何根据熊猫中另一列中的唯一值创建升序列



我有一个数据集,其中每行都是一个样本,一列(名称"sample_ID"(为每个样本命名(下面的df1(。某些样本重复多次(即"Sample_ID"的值相同(。我想根据表中从第一行到最后一行的简单升序模式(例如SAMP001、SAMP002、SAMP003等(,为每个样本生成一个具有不同名称的新列(我将称之为"sample_code"(。但是具有相同Sample_ID的行也需要具有相同的Sample_code值(所以我不能简单地为新列生成一组升序的样本名称(。

在下面的示例数据中,df1表示我的起始数据。df2是我想要的结果:Sample_code列的值随着每行的向下而上升,但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

EDIT理想情况下,我希望Sample_code名称按行的原始顺序递增,因为起始数据集中的行是按采集日期排序的。我希望Sample_code的名称基于特定样本在各行中第一次出现的时间。一个新的说明性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_ID值的最后一行创建Sample_code名称,例如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

使用groupby获取每个组号,然后应用字符串格式,例如:

df1['Sample_code'] = df1.groupby('Sample_ID').ngroup().add(1).apply('SAMP{:03}'.format)

您可以通过迭代唯一值来创建查找表,然后将其应用于新列:

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])

相关内容

最新更新