如何按Sample_Name将含重复样本ID的DataFrame与参考数据集做减法
问题描述
我有以下两个数据集:
参考数据集 ref_df
| Sample_Name | Value |
|---|---|
| CTRL | 18.17 |
| E-1 | 19.06 |
| FIB | 17.78 |
| 10nM Benz | 17.89 |
实验数据集 df1
| Sample_Name | Value |
|---|---|
| CTRL | 27.49 |
| E-1 | 28.89 |
| FIB | 24.81 |
| 10nM Benz | 24.24 |
| CTRL | 27.36 |
| E-1 | 28.87 |
| FIB | 24.66 |
| 10nM Benz | 24.32 |
需要实现df1的每个样本值减去ref_df中对应Sample_Name的参考值,得到如下目标结果df_result:
目标结果 df_result
| Sample_Name | Value |
|---|---|
| CTRL | 9.32 |
| E-1 | 9.83 |
| FIB | 7.03 |
| 10nM Benz | 6.35 |
| CTRL | 9.19 |
| E-1 | 9.81 |
| FIB | 6.88 |
| 10nM Benz | 6.43 |
要求保留df1中的重复样本,但直接复制ref_df匹配行数时,减法无法按Sample_Name对应匹配,请问该如何解决?
解决方案
方法1:使用map快速匹配参考值
将ref_df转换为以Sample_Name为键的字典,通过map为df1的每一行匹配对应参考值,再执行减法:
import pandas as pd # 构造示例数据 ref_df = pd.DataFrame({ 'Sample_Name': ['CTRL', 'E-1', 'FIB', '10nM Benz'], 'Value': [18.17, 19.06, 17.78, 17.89] }) df1 = pd.DataFrame({ 'Sample_Name': ['CTRL', 'E-1', 'FIB', '10nM Benz', 'CTRL', 'E-1', 'FIB', '10nM Benz'], 'Value': [27.49, 28.89, 24.81, 24.24, 27.36, 28.87, 24.66, 24.32] }) # 转换为Sample_Name到参考值的字典 ref_mapping = ref_df.set_index('Sample_Name')['Value'].to_dict() # 匹配参考值并计算差值 df1['Ref_Value'] = df1['Sample_Name'].map(ref_mapping) df_result = df1.assign(Value=df1['Value'] - df1['Ref_Value']).drop(columns='Ref_Value') # 输出保留两位小数的结果 print(df_result.round(2))
方法2:使用merge左连接匹配
通过左连接将ref_df的参考值合并到df1中,确保每个样本行都能匹配到对应参考值,再计算差值:
import pandas as pd # 构造示例数据,重命名参考值列避免冲突 ref_df = pd.DataFrame({ 'Sample_Name': ['CTRL', 'E-1', 'FIB', '10nM Benz'], 'Value': [18.17, 19.06, 17.78, 17.89] }).rename(columns={'Value': 'Ref_Value'}) df1 = pd.DataFrame({ 'Sample_Name': ['CTRL', 'E-1', 'FIB', '10nM Benz', 'CTRL', 'E-1', 'FIB', '10nM Benz'], 'Value': [27.49, 28.89, 24.81, 24.24, 27.36, 28.87, 24.66, 24.32] }) # 左连接匹配参考值 merged_df = pd.merge(df1, ref_df, on='Sample_Name', how='left') # 计算差值并整理结果 df_result = merged_df.assign(Value=merged_df['Value'] - merged_df['Ref_Value']).drop(columns='Ref_Value') print(df_result.round(2))
两种方法均能保留df1的原始行顺序和重复样本,输出结果与目标一致。map方法代码更简洁,适合参考数据集样本名称唯一的场景;merge方法灵活性更强,可应对更复杂的匹配逻辑。
内容的提问来源于stack exchange,提问作者cadillac_carlito
相关产品推荐
相关产品推荐

