Питон Панды. Извлечение строк с различным количеством столбцов и подстрок из строковых столбцов, содержащих вторичный разделитель - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть такой файл с разделителями табуляции:

10  5040637 rs2518044;rs536681963   CG  TG  C
10  34398820    rs150406373 C   G
10  35040637    rs532547811 TCCC    T

Используя Python-панд, я бы хотел:

1) Извлечь первые 4 столбца. 2) В тех случаях, когда есть строки типа "rs2518044; rs536681963" или "rs2518044; rs536681963; rs1111", я хочу извлечь часть перед первым ";".

Я бы получил что-то вроде этого:

10  5040637     rs2518044   CG
10  34398820    rs150406373 C
10  35040637    rs532547811 TCCC

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Вы можете использовать функцию, связанную с выражением регулярного выражения, такую ​​как str.extract, чтобы захватить группу перед первым ';'. Это будет работать намного лучше, чем использование собственных лямбда-функций, если шаблон сопоставления текста сложнее, чем просто захват группы перед первым ';'

In [15]: df
Out[15]: 
   col0      col1                   col2  col3 col4  col5
0    10   5040637  rs2518044;rs536681963    CG   TG     C
1    10  34398820            rs150406373     C    G  None
2    10  35040637            rs532547811  TCCC    T  None

In [16]: df
Out[16]: 
   col0      col1                   col2  col3 col4  col5
0    10   5040637  rs2518044;rs536681963    CG   TG     C
1    10  34398820            rs150406373     C    G  None
2    10  35040637            rs532547811  TCCC    T  None

In [17]: df2 = df.drop(columns=['col4', 'col5'])

In [18]: df2['col2'] = df.col2.str.extract('^([^;]+)', expand=False)

In [19]: df2
Out[19]: 
   col0      col1         col2  col3
0    10   5040637    rs2518044    CG
1    10  34398820  rs150406373     C
2    10  35040637  rs532547811  TCCC
0 голосов
/ 08 сентября 2018

Вы можете сделать разбиение на ; для этого столбца и оставить первый элемент. Для последнего столбца вы можете использовать drop.

Вот код:

import pandas as pd

df = pd.read_csv('data.tsv', sep='\t', names=['a', 'b', 'c', 'd', 'e', 'f'])

df.c = df.c.apply(lambda x: x.split(';')[0])
df.drop(labels=['e', 'f'], axis=1)
df


    a   b           c               d
0   10  5040637     rs2518044       CG
1   10  34398820    rs150406373     C
2   10  35040637    rs532547811     TCCC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...