python - 如何根据熊猫中另一列中的唯一值创建升序值列
问题描述
我有一个数据集,其中每一行都是一个样本,一列(名称“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
编辑 理想情况下,我希望升序 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)
推荐阅读
- angular - 我不断收到此错误 Observable<{}> 不可分配给 Observable
角 7 - database - ORA-12170: TNS: 发生连接超时 - 服务器连接到数据库
- ansible - 如何在剧本中创建数组字典
- google-apps-script - 编写脚本以根据另一个单元格值在列上导入 json
- sql - 如何获得不同行的差异
- laravel - 在 Laravel Backpack CRUD 视图中将 base64 代码渲染为图像
- amazon-web-services - 在 AWS S3 上设置 HTTPS 而不使用自定义域
- javascript - 如何在jQuery中反转字符串的大小写
- wix - 错误无法从程序集中加载“ResolveWixReferences”任务
- javascript - 位置 1 的 JSON 中的意外标记 u