如何按列分组并输出由制表符分隔的多列 - Python

我的目标是按“患者”列分组,并将每个患者输出为一行 =,然后依次从我的输入文件中输出多列。理想情况下,我更喜欢在列标题中有一个计数器。这是我的输入文件示例:


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    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


理想情况下,#Tests/gene/alteration ie Test_1gene_1alteration_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)

第二次尝试的结构不符合我的需要,但它确实为我提供了一个计数器


我想知道是否有人可以提供一些见解来获得所需的输出。我通过查看 SO 使用了上述命令,但无法进行故障排除。


阿晨1998
浏览 171回答 2
2回答

慕田峪7331174

下面是可能的解决方案之一。也许不是超级优雅,但有效。grouped = df.groupby('Patient')col = ['Patient']data = []for p, g in grouped:    d = {'Patient': p}    g.reset_index(inplace=True)    for i, row in g.iterrows():        for c in range(2, len(g.columns)):            col_name = g.columns[c] + '_' + str(i + 1)            d[col_name] = row[g.columns[c]]            if col_name not in col:                col.append(col_name)    data.append(d)df = pd.DataFrame(data, columns=col)

慕姐4208626

一种使用melt,groupby和的方法unstack:数据原来的In []: dfOut[]:   Patient Test  panel   gene alteration0        1    A     54    APC     E1345*1        1    B     54   TP53      Y205H2        1    C     54    APC     V2278V3        2    A     54   KRAS       G12D4        2    B     54   PTEN       L25L5        3    A     54   KRAS       G13D6        3    C     54   TP53      C141W7        3    C     54    APC     R876*8        3    A     54  ERBB2      L663P整齐的数据pd.DataFrame.melt 允许整理这张表:In []: tidy = df.melt(id_vars=['Patient', 'Test'], value_vars=['panel', 'gene', 'alteration'])In []: tidyOut[]:    Patient Test    variable   value0         1    A       panel      541         1    B       panel      542         1    C       panel      543         2    A       panel      544         2    B       panel      545         3    A       panel      546         3    C       panel      547         3    C       panel      548         3    A       panel      549         1    A        gene     APC10        1    B        gene    TP5311        1    C        gene     APC12        2    A        gene    KRAS13        2    B        gene    PTEN14        3    A        gene    KRAS15        3    C        gene    TP5316        3    C        gene     APC17        3    A        gene   ERBB218        1    A  alteration  E1345*19        1    B  alteration   Y205H20        1    C  alteration  V2278V21        2    A  alteration    G12D22        2    B  alteration    L25L23        3    A  alteration    G13D24        3    C  alteration   C141W25        3    C  alteration  R876*26        3    A  alteration   L663P重塑使用 goupby 和 unstackIn []: (tidy.groupby(['Patient', 'Test', 'variable'])  # group by three levels of interest     ...:   .first()                                   # access values as a dataframe     ...:   .unstack(level=[1,2]))                     # pivot on levels [1, 2] of multiindexOut[]:              valueTest              A                      B                      Cvariable alteration  gene panel alteration  gene panel alteration  gene panelPatient1            E1345*   APC    54      Y205H  TP53    54     V2278V   APC    542              G12D  KRAS    54       L25L  PTEN    54        NaN   NaN   NaN3              G13D  KRAS    54        NaN   NaN   NaN      C141W  TP53    54使用交叉表这给出了等效的结果:In []: pd.crosstab(tidy.Patient,                # index                   [tidy.Test, tidy.variable],  # columns                   values=tidy.value,                   aggfunc='first')             # get first valueOut[]:Test              A                      B                      Cvariable alteration  gene panel alteration  gene panel alteration  gene panelPatient1            E1345*   APC    54      Y205H  TP53    54     V2278V   APC    542              G12D  KRAS    54       L25L  PTEN    54        NaN   NaN   NaN3              G13D  KRAS    54        NaN   NaN   NaN      C141W  TP53    54
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python