gpt4 book ai didi

python - 如何从列中拆分字符串以创建长格式数据框

转载 作者:太空宇宙 更新时间:2023-11-03 15:07:39 25 4
gpt4 key购买 nike

如果我有如下所示的数据框,我该如何制作长格式数据框(即每行每个基因一个术语)。

我想我必须apply 或将 split(",") 映射到 Term 列,但我该怎么做之后呢?

import pandas as pd
from StringIO import StringIO

df = pd.read_table(StringIO("""Gene Terms
Mt-nd1 GO:0005739,GO:0005743,GO:0016021,GO:0030425,GO:0043025,GO:0070469,GO:0005623,GO:0005622,GO:0005737
Madd GO:0016021,GO:0045202,GO:0005886
Zmiz1 GO:0005654,GO:0043231
Cdca7 GO:0005622,GO:0005623,GO:0005737,GO:0005634,GO:0005654"""), sep="\s+")

附言。上面的表格是简化的,实际的 df 会有更多的列。

附言。如果我不清楚,我想以这样的方式结束:

Mt-nd1  GO:0005739
Mt-nd1 GO:0005743
Mt-nd1 GO:0016021
...
Cdca7 GO:0005634
Cdca7 GO:0005654

最佳答案

您可以使用 str.split 进行拆分(而不是应用和拆分方法,但类似):

In [6]: splitted = df['Terms'].str.split(',', expand=True)

In [7]: splitted
Out[7]:
0 1 2 3 4 5 \
0 GO:0005739 GO:0005743 GO:0016021 GO:0030425 GO:0043025 GO:0070469
1 GO:0016021 GO:0045202 GO:0005886 NaN NaN NaN
2 GO:0005654 GO:0043231 NaN NaN NaN NaN
3 GO:0005622 GO:0005623 GO:0005737 GO:0005634 GO:0005654 NaN

6 7 8
0 GO:0005623 GO:0005622 GO:0005737
1 NaN NaN NaN
2 NaN NaN NaN
3 NaN NaN NaN

要将其转换为列(而不是列表),您可以使用 expand=True 关键字来split,或者对于较旧的 pandas 版本,您可以执行 df['Terms'].str.split(',').apply(pd.Series) 以获得相同的结果。

现在,为了获得您想要的输出,我们必须堆叠这些列,但首先将其与基因列合并以在堆叠框架中包含此信息:

In [14]: stacked = pd.concat([df['Gene'], splitted],axis=1).set_index('Gene').stack()
In [15]: stacked
Out[15]:
Gene
Mt-nd1 0 GO:0005739
1 GO:0005743
2 GO:0016021
3 GO:0030425
4 GO:0043025
5 GO:0070469
6 GO:0005623
7 GO:0005622
8 GO:0005737
Madd 0 GO:0016021
1 GO:0045202
2 GO:0005886
Zmiz1 0 GO:0005654
1 GO:0043231
Cdca7 0 GO:0005622
1 GO:0005623
2 GO:0005737
3 GO:0005634
4 GO:0005654
dtype: object

从这里,我们可以重置索引,用术语重命名我们的列,并删除我们不再需要的整数列(从自动生成的列名):

In [19]: stacked.rename(columns={0:'Term'}).drop('level_1', axis=1)
Out[19]:
Gene Term
0 Mt-nd1 GO:0005739
1 Mt-nd1 GO:0005743
2 Mt-nd1 GO:0016021
3 Mt-nd1 GO:0030425
4 Mt-nd1 GO:0043025
5 Mt-nd1 GO:0070469
6 Mt-nd1 GO:0005623
7 Mt-nd1 GO:0005622
8 Mt-nd1 GO:0005737
9 Madd GO:0016021
10 Madd GO:0045202
11 Madd GO:0005886
12 Zmiz1 GO:0005654
13 Zmiz1 GO:0043231
14 Cdca7 GO:0005622
15 Cdca7 GO:0005623
16 Cdca7 GO:0005737
17 Cdca7 GO:0005634
18 Cdca7 GO:0005654

如何将它与您拥有的其他列组合或合并,将取决于您究竟想用它做什么。

关于python - 如何从列中拆分字符串以创建长格式数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30847775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com