我有一个来自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
谢谢!
答案 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
请注意:
0
的列)。例如在索引为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('')