Python pandas сравнение векторизации между 2 фреймами данных - PullRequest
0 голосов
/ 14 июля 2020

У меня есть два фрейма данных разной длины.

df1

    gene_name   chr start   stop    gene
0   ARNTL   chr11   13376772    13376843    gene_name
1   ARNTL   chr11   13393709    13393956    gene_name
2   PPP4R1  chr18   9595015 9595151 gene_name
3   PPP4R1  chr18   9595015 9595151 gene_name
4   SLC9B1  chr4    103806204   103806485   gene_name
... ... ... ... ... ...
4640    GCDH    chr19   13010281    13010813    gene_name
4641    ARL4A   chr7    12727790    12730558    gene_name
4642    ARL4A   chr7    12727790    12730558    gene_name
4643    SMURF1  chr7    98630659    98630744    gene_name
4644    TSTD1   chr1    161007421   161007865   gene_name
4645 rows × 5 columns

d3

        chr start   stop    exon    exon_number gene    gene_name
0   chr1    901877  901994  exon_number 1   gene_name   PLEKHN1
1   chr1    902084  902183  exon_number 2   gene_name   PLEKHN1
2   chr1    905657  905803  exon_number 3   gene_name   PLEKHN1
3   chr1    905901  905981  exon_number 4   gene_name   PLEKHN1
4   chr1    906066  906138  exon_number 5   gene_name   PLEKHN1
... ... ... ... ... ... ... ...
243869  chrY    15526615    15526673    exon_number 5   gene_name   UTY
243870  chrY    15522873    15522993    exon_number 6   gene_name   UTY
243871  chrY    15508182    15508852    exon_number 7   gene_name   UTY
243872  chrY    15591394    15591803    exon_number 1   gene_name   UTY
243873  chrY    15590922    15591197    exon_number 2   gene_name   UTY
243874 rows × 7 columns

Я пытаюсь перебирать строки df1 и сравнивать их с d3

вот мой текущий код.

for r,i in df1.iterrows():
    for row, items in d3.iterrows():
        if i[1] == items[0] and i[2] >= items[1] and i[3] <= items[2] and i[0] == items[6]:
            print(i,items)

это выполняет свою работу, но требует довольно много времени для запуска на таком большом количестве строк.

Я хотел бы векторизовать это, но убедитесь, как лучше поступить.

1 Ответ

0 голосов
/ 14 июля 2020

Используйте pd.merge:

df = pd.merge(df1, d3, on=['chr', 'gene_name'])
df = df[(df.start_x >= df.start_y) & (df.stop_x <= df.stop_y)]

(кстати, лучше использовать имена столбцов, не сбивая с толку индикаторы столбцов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...