You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中基于Sample列合并两个DataFrame并实现列转行,使total_reads匹配对应取值

解决Pandas中基于Sample列合并两个DataFrame并转换列到行的问题

这是个典型的宽表转长表再合并的场景,咱们一步步来实现你需要的效果:

步骤1:构造示例DataFrame

首先先把你提供的数据转换成Pandas DataFrame(如果你的数据已经是DataFrame了,这步可以跳过):

import pandas as pd

# 第一个DataFrame(包含total_reads的表)
df1 = pd.DataFrame({
    'sample': ['ERR4223677', 'ERR4225180', 'ERR4225239', 'ERR4225273', 'ERR4225325', 'ERR4225370', 'ERR4225386', 'ERR4225387'],
    'Downsample': ['Down_10', 'Down_50', 'Down_50', 'Down_75', 'Raw_Data', 'Down_25', 'Down_75', 'Raw_Data'],
    'Series': ['ERP120397']*8,
    'total_reads': [2500121, 12500608, 22190433, 18750912, 25001217, 11095216, 33285650, 44380867]
})

# 第二个DataFrame(需要转成行的宽表)
df2 = pd.DataFrame({
    'series': ['ERP120397']*7,
    'sample': ['ERR4223677', 'ERR4225180', 'ERR4225239', 'ERR4225273', 'ERR4225325', 'ERR4225370', 'ERR4225386'],
    'Raw_Data': [762828, 1304291, 1007582, 872706, 1052892, 913854, 1174005],
    'Down_75': [666093, 1085140, 857346, 750629, 900727, 771552, 995511],
    'Down_50': [534468, 816593, 664345, 592641, 701227, 590478, 767682],
    'Down_25': [342070, 467548, 394410, 362647, 420112, 347846, 455647],
    'Down_10': [177346, 206039, 180437, 172176, 187159, 159422, 204522]
})

步骤2:统一列名并转换宽表为长表

第二个DataFrame的series列名和第一个的Series不一致,先统一;然后用melt函数把宽表转成和第一个表结构匹配的长表:

# 统一列名,确保合并时键一致
df2 = df2.rename(columns={'series': 'Series'})

# 将df2的Downsample类型列转为行,生成和df1匹配的结构
df2_long = df2.melt(
    id_vars=['Series', 'sample'],  # 保留不需要转换的标识符列
    value_vars=['Raw_Data', 'Down_75', 'Down_50', 'Down_25', 'Down_10'],  # 需要转为行的列
    var_name='Downsample',  # 新列名:存储原来的Downsample类型
    value_name='mapped_reads'  # 新列名:存储对应的值(你可以根据实际需求改名)
)

步骤3:合并两个DataFrame

现在两个表的结构一致了,直接用merge函数基于sample、Series和Downsample三个键合并,确保total_reads能匹配到正确的对应值:

# 左连接保留df1的所有行,即使df2没有对应数据(比如ERR4225387)
merged_df = pd.merge(
    df1,
    df2_long,
    on=['sample', 'Series', 'Downsample'],
    how='left'
)

# 查看合并结果
print(merged_df)

结果说明

合并后的DataFrame会保留df1的所有total_reads数据,同时匹配到df2中对应sample和Downsample类型的数值。对于df2中没有的行(比如ERR4225387),对应的mapped_reads会显示为NaN,你可以根据需求用fillna()填充或者dropna()删除这些行。

内容的提问来源于stack exchange,提问作者spaceghost

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 17:27:36