Сортировка данных с использованием ключа в Python

Я получил формат данных, как:

ATOM 124 N GLU B 12
ATOM 125 O GLU B 12
ATOM 126 OE1 GLU B 12
ATOM 127 C GLU B 12
ATOM 128 O GLU B 14
ATOM 129 N GLU B 14
ATOM 130 OE1 GLU B 14
ATOM 131 OE2 GLU B 14
ATOM 132 CA GLU B 14
ATOM 133 C GLU B 15
ATOM 134 CA GLU B 15
ATOM 135 OE2 GLU B 15
ATOM 136 O GLU B 15
             .....100+ lines

Отсюда я хочу отфильтровать эти данные на основе col[5] (начальный счетчик столбцов от 0) и col[2], в value из col[5] если OE1 или же OE2 случается только один раз, тогда набор данных будет отброшен. Но для каждого значения col[5] если OE1 а также OE2 оба присутствуют, это будет сохранено.
Желаемые данные после фильтрации:

ATOM 128 O GLU B 14
ATOM 129 N GLU B 14
ATOM 130 OE1 GLU B 14
ATOM 131 OE2 GLU B 14
ATOM 132 CA GLU B 14

Я пытался использовать search_string лайк:

for item in stored_list:
    search_str_a = 'OE1'+item[3]+item[4]+item[5]
    search_str_b = 'OE2'+item[3]+item[4]+item[5]
    target_str = item[2]+item[3]+item[4]+item[5]

Это полезно для поддержания отдыха col так во время поиска OE1 или же OE2, но не полезно для фильтрации и устранения, если один из них (или оба) отсутствует.

Любые идеи были бы действительно хороши здесь.

2 ответа

Приведенный ниже код требует панд, вы можете скачать его с http://pandas.pydata.org/pandas-docs/stable/install.html

import pandas as pd

file_read_path = "give here source file path"
df = pd.read_csv(file_read_path, sep= " ", names = ["col0","col1","col2","col3","col4","col5"])
group_series =  df.groupby("col5")["col2"].apply(lambda x: "%s" % ', '.join(x))

filtered_list = []
for index in group_series.index:
    str_col2_group = group_series[index]
    if "OE1" in str_col2_group and "OE2" in str_col2_group:
        filtered_list.append(index)

df = df[df.col5.isin(filtered_list)]
output_file_path = "give here output file path"
df.to_csv(output_file_path,sep = " ",index = False,header = False)

это было бы полезно http://pandas.pydata.org/pandas-docs/stable/tutorials.html

Выходной результат

ATOM 128 O GLU B 14
ATOM 129 N GLU B 14
ATOM 130 OE1 GLU B 14
ATOM 131 OE2 GLU B 14
ATOM 132 CA GLU B 14

Используя CSV, он поставляется с Python

import csv
import operator

file_read_path = "give here source file path"
with open(file_read_path) as f_pdb:
    rdr = csv.DictReader(f_pdb,delimiter=' ', fieldnames = ["col0","col1","col2","col3","col4","col5"])
    sorted_bio = sorted(rdr,key=operator.itemgetter('col5'),reverse=False)
    col5_tmp = None
    tmp_list = []
    perm_list = []
    tmp_str = ""
    col5_v = ""
    for row in sorted_bio:
        col5_v = row["col5"]
        if col5_v != col5_tmp:
            if "OE1" in tmp_str and "OE2" in tmp_str:
                perm_list.extend(tmp_list)
            tmp_list = []
            tmp_str = ""
            col5_tmp = col5_v
        tmp_list.append(row)
        tmp_str = tmp_str +","+ row["col2"]

    if col5_v != col5_tmp:
        if "OE1" in tmp_str and "OE2" in tmp_str:
            perm_list.extend(tmp_list)


csv_file = open("give here output file path","w")
dict_writer = csv.DictWriter(csv_file,delimiter=' ', fieldnames = ["col0","col1","col2","col3","col4","col5"])
for row in perm_list:
    dict_writer.writerow(row)
csv_file.close()
Другие вопросы по тегам