我的目标是按“Patient”列分组,并在一行中输出每个患者=,然后按顺序从输入文件中输出多个列。理想情况下,我更希望在列标题中有一个计数器。下面是我的输入文件示例:
Patient Test panel gene alteration
1 A 54 APC E1345*
1 B 54 TP53 Y205H
1 C 54 APC V2278V
2 A 54 KRAS G12D
2 B 54 PTEN L25L
3 A 54 KRAS G13D
3 C 54 TP53 C141W
3 C 54 APC R876*
3 A 54 ERBB2 L663P
预期输出,按“Patient”列分组,然后在“Test”、“gene”和“alternation”列上循环以创建以下内容:
Patient Test gene alteration Test gene alteration Test gene alteration Test gene alteration Test gene alteration
1 A APC E1345* B TP53 Y205H C TP53 Y205H
2 A KRAS G12D B PTEN L25L
3 A KRAS G13D C TP53 C141W C APC R876* A ERBB2 L663P A ERBB2 L663P
理想情况下,最好是测试/基因/改变,即测试1基因1改变1等等。然而,我意识到这让事情变得复杂。你知道吗
这是我尝试过的,我无法得到感兴趣的结果
df = pd.read_table(args.md, sep="\t")
df=pd.DataFrame(df) #I used an input file
values=grouped['gene'].apply('\t'.join).reset_index()
此函数的输出1)不允许我组合超过'gene'列,因此如果我使用['gene','Test'],它将不会给出所需的输出;2)连接的'\t'将作为'\t'而不是制表符输出
所以我试着
grouped=df.groupby('Patient')
print grouped
values=grouped['gene'].apply('\t'.join).reset_index()
print values
id_df = grouped['Test'].apply(lambda x: pd.Series(x.values)).unstack()
id_df = id_df.rename(columns={i: 'Test{}'.format(i + 1) for i in range(id_df.shape[1])})
result = pd.concat([id_df, values], axis=1)
print(result)
第二次尝试的结构不符合我的需要,但它确实为我提供了一个计数器
我想知道是否有人可以提供一些见解,以获得所需的输出。我使用了上面的命令,但无法排除故障。你知道吗
使用
melt
、groupby
和unstack
的方法:数据
原始
整理数据
pd.DataFrame.melt
允许整理此表:重塑
使用goupby和unstack
使用交叉表
这就得到了相同的结果:
下面是一个可能的解决方案。也许不是很优雅,但很管用。你知道吗
相关问题 更多 >
编程相关推荐