2015-08-09 2 views
1

я получил формат данных, как:сортировки данных с помощью ключа в питона

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]. Per 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, но не полезно фильтровать и устранять, если отсутствует один из них (или их обоих).

Любые идеи были бы очень хорошими здесь.

+0

Итак, вы хотите сохранить 'col [5] = 14'? – Kasramvd

+0

для одного значения 'col [5]' нам нужно выполнить поиск 'col [3]' и после принятия решений относительно хранения данных или отбрасывания (в зависимости от наличия как 'OE1', так и' OE2') мы повторяем значение 'col [5]' и продолжать поиск таким же образом @Avinash Raj Это моя идея до сих пор. – diffracteD

+1

Вы должны упомянуть, что вы разбираете файлы PDB, так как там * есть биоинформатики. В этом случае проверьте модуль Biopython ['Bio.PDB'] (http://biopython.org/wiki/The_Biopython_Structural_Bioinformatics_FAQ). Я не имею ни малейшего понятия, какую информацию вы пытаетесь получить здесь, так как ваш вопрос довольно неясен, но чтение через связанный FAQ поможет вам в значительной степени. – MattDMo

ответ

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 
+0

высоко оценили, хотя немного не-панда было бы лучше ... @ Romil – diffracteD

+0

Конечно, работа над этим –

0

с помощью CSV, он поставляется с питоном

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() 
Смежные вопросы