Я создал 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('')
к последней инструкции.
Edit
Существует более короткое решение: после создания a
выможет выполнить всю остальную обработку с помощью single инструкции:
pmap1.join(a[0].unstack()).fillna('')