Разделение хитрой строки на весь фрейм данных - PullRequest
0 голосов
/ 29 мая 2018
0    NC_000001.10:g.955563G>C
1    NC_000001.10:g.955597G>T
2    NC_000001.10:g.955619G>C
3    NC_000001.10:g.957640C>T
4    NC_000001.10:g.976059C>T
5    NC_000003.11:g.37090470C>T
6    NC_000012.11:g.133256600G>A
7    NC_012920.1:m.15923A>G

У меня есть столбец в наборе данных, который выглядит как выше.Используя первую строку в качестве примера, информация, которую я хотел бы оставить, - это один столбец, содержащий 955563, и один столбец, содержащий G> C.Я поиграл с парой регулярных выражений, которые нашел здесь, но не нашел такого, который бы помог.

Ответы [ 3 ]

0 голосов
/ 29 мая 2018
':.*\.(\d+)(\w>\w)'

:.*\. ищет : и любой символ (поскольку в вашем примере есть и «g», и «m») вплоть до периода, предшествующего области, которую мы хотим захватить.

ПервыйГруппа: (\d+) соответствует 1 или более цифрам.

Вторая группа: (\w>\w) соответствует символу слова, за которым следует >, за которым следует символ слова

0 голосов
/ 29 мая 2018

Это один из способов без регулярных выражений.Обратите внимание, что это решение использует отформатированные строковые литералы из Python 3.6 ( PEP 498 ).

def splitter(x):
    y = x.rsplit('.', maxsplit=1)[-1].split('>')
    return int(y[0][:-1]), f'{y[0][-1]}>{y[1]}'

df[['2', '3']] = df[1].apply(splitter).apply(pd.Series)

print(df)

   0                            1          2    3
0  0     NC_000001.10:g.955563G>C     955563  G>C
1  1     NC_000001.10:g.955597G>T     955597  G>T
2  2     NC_000001.10:g.955619G>C     955619  G>C
3  3     NC_000001.10:g.957640C>T     957640  C>T
4  4     NC_000001.10:g.976059C>T     976059  C>T
5  5   NC_000003.11:g.37090470C>T   37090470  C>T
6  6  NC_000012.11:g.133256600G>A  133256600  G>A
7  7       NC_012920.1:m.15923A>G      15923  A>G
0 голосов
/ 29 мая 2018

Для вашего примера работает следующее:

df[0].str.extract(':\w\.(\d+)(.+)')
#           0    1
#0     955563  G>C
#1     955597  G>T
#2     955619  G>C
#3     957640  C>T
#4     976059  C>T
#5   37090470  C>T
#6  133256600  G>A
#7      15923  A>G

Если последний «столбец» всегда имеет структуру A> A, где A - одна буква, то вы можете быть более конкретным с:

df[0].str.extract(':\w\.(\d+)(\w>\w)')
...