首页 > 解决方案 > 在保留重复项的同时转置多个 pandas 列

问题描述

我正在尝试转置或转换以下数据框:

chr    start1    end1    start2    end2    sample_id
chr1      111      222      333    444     id1
chr1      555      666      777    888     id1
chr2      989      999      111    112     id1
chr2      777      663      332    112     id1

进入以下数据框:

chr    start    end   sample_id
chr1    111     222   id1
chr1    333     444   id1
chr1    555     666   id1
chr1    777     888   id1
chr2    989     999   id1
chr2    111     112   id1

我曾尝试使用 pandas melt 和 append 方法,但都没有成功,有没有办法使用 Pandas 做到这一点?

这是我使用 pandas.melt 的尝试:

merge_coordinates = pd.melt(df, id_vars=['chrom', 'sample_id'], value_vars ['start1', 'end1', 'start2', 'end2'])

使用 append: 部分成功,但我不知道如何关联其他列(chr、sample_id)并将它们附加到新创建的列:

start = df['start1'].append(df['start2']).reset_index(drop=True)
end = df['end1'].append(df['end2']).reset_index(drop=True)

提前谢谢了

标签: python-3.xpandasdataframe

解决方案


尝试:

df=df.reset_index()

最后使用wide_to_long()

out=(pd.wide_to_long(df,['start','end'],i=['index','chr','sample_id'],j='idx')
   .reset_index()
   .drop_duplicates(['index','chr','sample_id','idx'])
   .drop(['index','idx'],1))

更新:

由于上述解决方案不适合您,因此这里是替代解决方案:

df=df.rename(columns=lambda x: x[0:-1] if x[-1].isnumeric() else x)
out=df.melt(['chr','sample_id']).reset_index()

最后:

out=(out.pivot(['index','chr','sample_id'],'variable','value')
        .agg(sorted,key=pd.isnull)
        .dropna()
        .reset_index(level=[1,2])
        .rename_axis(index=None,columns=None))

输出out

    chr     sample_id   start   end
0   chr1    id1         111     222
1   chr1    id1         333     444
2   chr1    id1         555     666
3   chr1    id1         777     888
4   chr2    id1         989     999
5   chr2    id1         111     112
6   chr2    id1         777     663
7   chr2    id1         332     112

推荐阅读