python-3.x - 在保留重复项的同时转置多个 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)
提前谢谢了
解决方案
尝试:
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
推荐阅读
- python - 将 x 轴刻度标签格式化为接缝,如默认的熊猫图
- python - 在 Pandas 中计算基于过去值的乘积而不循环的值
- mysql - MYSQL 加入最近的记录并相乘
- javascript - 如何使用 javascript 验证用户输入
- swift - 如何防止新用户登录,直到他们在firebase swift中验证他们的电子邮件?
- scala - Scala:使用 immutable.Map 不需要导入?
- php - 根据成员和一年中的月份映射表格的好方法
- angular - 如何将科尔多瓦项目连接到数据库?
- docker - 干净地删除 NPM 安装的可执行文件
- css - Wordpress 固定标题在移动滚动上消失