回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个数据集,其中每一行都是一个样本,每一个样本都有一个列(名为“sample_ID”)(下面的df1)。某些样本重复多次(即“样本ID”的值相同)。我想根据从表中第一行到最后一行的简单升序模式(例如SAMP001、SAMP002、SAMP003等),为每个样本生成一个具有不同名称的新列(我称之为“样本代码”)。但是具有相同Sample_id的行也需要具有相同的Sample_代码值(因此我不能简单地为新列生成一组递增的示例名称)</p>
<p>在下面的示例数据中,df1表示我的起始数据。df2是我想要的结果:Sample_code列的值随着每行的下降而上升,但对于复制Sample_ID的行,其值相同</p>
<p>我很困惑从哪里开始,所以非常感谢您的帮助,谢谢</p>
<pre><code>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
</code></pre>
<p><strong>编辑</strong>
理想情况下,我希望升序样本_代码名按行的原始顺序排列,因为起始数据集中的行是按收集日期排序的。我希望示例代码名基于您在下一行中第一次出现特定示例的时间。
一个新的说明性df3有一个date列,可以理解我的意思</p>
<pre><code># 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
</code></pre>
<p>下面建议的解决方案是可行的,但它会根据重复样本ID值出现的最后一行创建样本代码名,例如,样本ID“123123”标记为“SAMP006”(对于出现的最后一行,此值),但我希望此代码名为“SAMP001”(它出现的第一行)</p>
<pre><code>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
</code></pre>