Сортировать уникально по нескольким столбцам, затем объединить значения в несоответствующие столбцы - PullRequest
1 голос
/ 28 октября 2019

Рассмотрим файл постели, содержащий генетические варианты:

CHR START STOP RSID REF / ALT PHENOTYPE PVALUE
1 987654321 987654322 rs123456 A / T Высота 6E-9
1 987654321 987654322 rs123456 A / TХод 8E-15

Я хочу отсортировать уникальные по первым 5 столбцам, а затем объединить содержимое столбцов с уникальными значениями:

Пример вывода:

CHRSTART STOP RSID REF / ALT PHENOTYPE PVALUE
1 987654321 987654322 rs123456 A / T Высота, инсульт 6E-9,8E-15

Возможно ли это в Python или Unix? Или мне нужно написать скрипт?

Если это возможно в Python или Unix, какая функция позволяет мне это сделать?


Этот вопрос был рассмотрен здесь но никогда не решается.

Ответы [ 3 ]

3 голосов
/ 28 октября 2019

Python

С Python это можно сделать с помощью pandas.dataframe.groupby и agg с пользовательской лямбда-функцией lambda x: ','.join(x)

import pandas as pd
from io import StringIO

text='''CHR START STOP RSID REF/ALT PHENOTYPE PVALUE
1 987654321 987654322 rs123456 A/T Height 6E-9
1 987654321 987654322 rs123456 A/T Stroke 8E-15'''

df = pd.read_csv(StringIO(text), sep=' ', dtype={'PVALUE': str})
print(df)
   CHR      START       STOP      RSID REF/ALT PHENOTYPE PVALUE
0    1  987654321  987654322  rs123456     A/T    Height   6E-9
1    1  987654321  987654322  rs123456     A/T    Stroke  8E-15

df_res = (df.groupby(['CHR', 'START', 'STOP', 'RSID', 'REF/ALT'])
          .agg({'PHENOTYPE': lambda x: ','.join(x),
                'PVALUE': lambda x: ','.join(x)})
          .reset_index())
print(df_res)
   CHR      START       STOP      RSID REF/ALT      PHENOTYPE      PVALUE
0    1  987654321  987654322  rs123456     A/T  Height,Stroke  6E-9,8E-15

Используйте sort_values ​​ для сортировки df_res с нужными вам ордерами.

2 голосов
/ 28 октября 2019
import pandas as pd
data = pd.read_csv('file_name.txt',dtype={'PVALUE':'object'}, sep = ' ' )
PVALUE = data.groupby(['CHR', 'START', 'STOP', 'RSID', 'REF/ALT'])['PVALUE'].apply(','.join).reset_index()['PVALUE']
data = data.groupby(['CHR', 'START', 'STOP', 'RSID', 'REF/ALT'])['PHENOTYPE'].apply(','.join).reset_index()
data['PVALUE'] = PVALUE
print(data)
   CHR      START       STOP      RSID REF/ALT      PHENOTYPE      PVALUE
0    1  987654321  987654322  rs123456     A/T  Height,Stroke  6E-9,8E-15
1 голос
/ 28 октября 2019

Вот способ ванильного Python сделать это:

from collections import defaultdict

# Open both files for reading and writing
with open("input.txt") as fin, open("output.txt", mode="w") as fout:
    grouped_columns = defaultdict(list)

    # Extract headers
    headers = next(fin)

    # Collect grouped columns in defaultdict, using first 5 columns as the key
    for line in fin:
        line = line.strip().split()
        grouped_columns[tuple(line[:5])].append(line[5:])

    # Write out result from dictionary
    fout.write(headers)
    for key, value in grouped_columns.items():
        fout.write(
            "%s %s"
            % (
                " ".join(key),
                " ".join("%s,%s" % (ptype, pval) for ptype, pval in zip(*value)),
            ) 
        )

output.txt

CHR START STOP RSID REF/ALT PHENOTYPE PVALUE
1 987654321 987654322 rs123456 A/T Height,Stroke 6E-9,8E-15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...