Сортировка данных с использованием ключа в 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()