如何在Pandas中使用extractall并使用提取的字符串获取新列?

时间:2019-05-14 15:59:37

标签: python-3.x pandas indexing

我有一个来自csv文件的15列的数据框。我试图删除一列文本的一部分,并创建一个新列,在每一行上包含该信息。每行“磷酸盐”应该只与我对extractall的要求相匹配。现在,我尝试将结果添加到数据框中,但出现错误:

TypeError:插入的列的索引与框架索引不兼容

数据集有两列带有名称的列,还有6列带有值的列(例如65.98,例如)。

例如: 登录序列修饰磷酸CON_1 CON_2 CON_3 LIF1 LIF2 LIF3 P18767 [R] .GAAQNIIPASTGAAK。[A] 1xTMT6plex [K15]; 1xTMT6plex [N-Term] 1xPhospho [S3(98.3)]

这是奇怪的代码:

    a = pmap1['phospho'].str.extractall(r'([STEHRYD]\d*)')
    pmap1['phosphosites'] = a

谢谢!

1 个答案:

答案 0 :(得分:0)

我使用以下示例数据创建了pmap1

pmap1 = pd.DataFrame(data=[[ 'S34T44X', 1 ], [ 'E23H78Y', 2 ],
    [ 'R49Y81Z', 3 ], [ 'D20U23X', 4 ]], columns=['phospho', 'nn'])

提取所有匹配项时:

a = pmap1['phospho'].str.extractall(r'([STEHRYD]\d*)')

结果是:

           0
  match     
0 0      S34
  1      T44
1 0      E23
  1      H78
  2        Y
2 0      R49
  1      Y81
3 0      D20

请注意:

  • 结果为 DataFrame 类型(只有一个名为0的列)。
  • 它包含行。因此尚不清楚插入哪一行 特定的比赛。
  • 索引实际上是具有两个级别的 MultiIndex
    • 第一级(未命名)是源行的索引,
    • 第二级(名为 match )包含 在当前行中匹配。

例如在索引为0的行中,有2个匹配项:

  • S34-不为0,
  • T44-否1。

因此,您不能直接将a另存为pmap1的新列, 例如因为pmap1包含“普通”索引,并且 a MultiIndex ,与pmap1的索引不兼容。 而这就是在错误消息中写的。

如果您想以某种方式将a添加到pmap1,则可以例如“打破”每场比赛 通过以下方式作为单独列:

a2 = a.unstack()

给出结果:

         0          
match    0    1    2
0      S34  T44  NaN
1      E23  H78    Y
2      R49  Y81  NaN
3      D20  NaN  NaN

其中 MultiIndex ,因此删除第一个 级别,请运行:

a2.columns = a2.columns.droplevel()

结果是:

match    0    1    2
0      S34  T44  NaN
1      E23  H78    Y
2      R49  Y81  NaN
3      D20  NaN  NaN

然后您可以执行实际的联接,执行:

pmap1.join(a2)

结果是:

   phospho  nn    0    1    2
0  S34T44X   1  S34  T44  NaN
1  E23H78Y   2  E23  H78    Y
2  R49Y81Z   3  R49  Y81  NaN
3  D20U23X   4  D20  NaN  NaN

如果您对数字作为列名不满意,可以将其更改为 你想要的。

如果您对“缺少”匹配项的 NaN 值不满意 (对于与其他行相比找到较少匹配项的行), 将.fillna('')添加到最后一条指令。

编辑

有一个较短的解决方案: 创建a后,您可以完成其余的全部处理 带有说明:

pmap1.join(a[0].unstack()).fillna('')