为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

阿晨1998 2021-11-16 18:16:47
我的目标是按“患者”列分组,并将每个患者输出为一行 =,然后依次从我的输入文件中输出多列。理想情况下,我更喜欢在列标题中有一个计数器。这是我的输入文件示例:Patient Test    panel   gene    alteration1   A   54  APC E1345*1   B   54  TP53    Y205H1   C   54  APC V2278V2   A   54  KRAS    G12D2   B   54  PTEN    L25L3   A   54  KRAS    G13D3   C   54  TP53    C141W3   C   54  APC R876* 3   A   54  ERBB2   L663P 按“患者”列分组的预期输出,然后循环“测试”、“基因”和“改变”列以创建以下内容:Patient Test    gene    alteration  Test    gene    alteration  Test    gene    alteration  Test    gene    alteration  Test    gene    alteration1   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 groupedvalues=grouped['gene'].apply('\t'.join).reset_index()print valuesid_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 使用了上述命令,但无法进行故障排除。
查看完整描述

2 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

下面是可能的解决方案之一。也许不是超级优雅,但有效。


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)


查看完整回答
反对 回复 2021-11-16
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

一种使用melt,groupby和的方法unstack:


数据

原来的

In []: df

Out[]:

   Patient Test  panel   gene alteration

0        1    A     54    APC     E1345*

1        1    B     54   TP53      Y205H

2        1    C     54    APC     V2278V

3        2    A     54   KRAS       G12D

4        2    B     54   PTEN       L25L

5        3    A     54   KRAS       G13D

6        3    C     54   TP53      C141W

7        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 []: tidy

Out[]:

    Patient Test    variable   value

0         1    A       panel      54

1         1    B       panel      54

2         1    C       panel      54

3         2    A       panel      54

4         2    B       panel      54

5         3    A       panel      54

6         3    C       panel      54

7         3    C       panel      54

8         3    A       panel      54

9         1    A        gene     APC

10        1    B        gene    TP53

11        1    C        gene     APC

12        2    A        gene    KRAS

13        2    B        gene    PTEN

14        3    A        gene    KRAS

15        3    C        gene    TP53

16        3    C        gene     APC

17        3    A        gene   ERBB2

18        1    A  alteration  E1345*

19        1    B  alteration   Y205H

20        1    C  alteration  V2278V

21        2    A  alteration    G12D

22        2    B  alteration    L25L

23        3    A  alteration    G13D

24        3    C  alteration   C141W

25        3    C  alteration  R876*

26        3    A  alteration   L663P

重塑

使用 goupby 和 unstack

In []: (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 multiindex

Out[]:

              value

Test              A                      B                      C

variable alteration  gene panel alteration  gene panel alteration  gene panel

Patient

1            E1345*   APC    54      Y205H  TP53    54     V2278V   APC    54

2              G12D  KRAS    54       L25L  PTEN    54        NaN   NaN   NaN

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

Out[]:

Test              A                      B                      C

variable alteration  gene panel alteration  gene panel alteration  gene panel

Patient

1            E1345*   APC    54      Y205H  TP53    54     V2278V   APC    54

2              G12D  KRAS    54       L25L  PTEN    54        NaN   NaN   NaN

3              G13D  KRAS    54        NaN   NaN   NaN      C141W  TP53    54


查看完整回答
反对 回复 2021-11-16
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信