Как использовать extractall в Pandas и получить новый столбец с извлеченными строками? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть кадр данных из 15 столбцов из CSV-файла. Я пытаюсь удалить одну часть текста столбца и создать новый столбец, содержащий эту информацию в каждой строке. В каждом ряду «Фосфо» должно быть только одно совпадение с моими требованиями к извлечению. Теперь я пытаюсь добавить результат в свой фрейм данных, но получаю ошибку:

TypeError: несовместимый индекс вставленного столбца с индексом кадра

В наборе данных есть два столбца с именами и 6 столбцов со значениями (например, 65,98, например).

Ex: изменение последовательности присоединения phospho 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 голосов
/ 14 мая 2019

Я создал 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('')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...