Перебор файлов и добавление значений в словарь Python - PullRequest
0 голосов
/ 23 октября 2019

У меня есть набор из 50 текстовых файлов, все из которых настроены на первую строку заголовка, первый столбец - имена генов, а остальные столбцы - значения для каждого гена. У меня также есть официальный текстовый файл со списком генов. Я хочу использовать официальный список имен генов для создания словаря, затем перебрать файлы, определить, совпадает ли имя гена для каждой строки с именем гена в словаре, и, если это так, добавить значение словаря с дополнительными значениями изэкспериментальный файл.

Итак, экспериментальный файл выглядит следующим образом:

GENE    Exp1    Exp2
geneA   12      34
geneB   42      10
geneC   42      10

Официальный список генов выглядит так:

GENE    
geneA   
geneC

Я пытался использовать defaultdictи следующий код (только для одного экспериментального файла, но позже он может повторяться и более):

combo = {}

with open('official_gene_list.txt', 'r') as f:
    f.readline()
    for line in f:
        name = line.split('\n')[0]
        combo[name]={}

with open('expeirmenta1_file.txt', 'r') as g:
for each in g:
    name2 = each.split('\t')[0]
    data = each.rstrip('\n').split('\t')[1:]
    for name2 in combo:
        combo[name2].append(data)

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

AttributeError: 'dict' object has no attribute 'append'

Я также пытался использовать defaultdict ():

from collections import defaultdict
combo = defaultdict(list)
with open('gene_orf_updated2.txt', 'r') as f:
    f.readline()
    for line in f:
        name = line.split('\n')[0]
        combo[name]={}
with open('GSE139_meanCenter_results.txt', 'r') as g:
    for each in g:
        name2 = each.split('\t')[0]
        data = each.rstrip('\n').split('\t')[1:]
        for name2 in combo:
            combo[name2].append(data)

И я получаю ту же ошибку, что у объекта 'dict' нет атрибута 'append'.

Я уже делал словари, но никогда не пытался добавлять новые значения к существующим ключам, как это. Это возможно? Любая помощь или совет будет принята с благодарностью.

Ответы [ 4 ]

0 голосов
/ 23 октября 2019
import pandas as pd

def print_file(f_name):
    print('\n\n'+f_name)
    print('*'*10)
    print(open(f_name,'r').read())

gene_fname = 'genes.txt'
print_file(gene_fname)
gene = pd.read_csv(gene_fname)
df_final = pd.DataFrame(gene)
df_final['combined'] = [list() for x in range(len(df_final.index))]

for val in ['values1.txt','values2.txt','values3.txt','values4.txt']:
    print_file(val)
    val_df = pd.read_csv(val,header=0,delim_whitespace=True)
    df_final = pd.merge(df_final,val_df,on='GENE',how='left')
    df_final['new'] = df_final.loc[:,df_final.columns.difference(['GENE','combined'])].values.tolist()
    df_final['combined'] = df_final['new']+df_final['combined']
    df_final.drop(df_final.columns.difference(['GENE','combined']),1,inplace=True)

df_final['combined'] = df_final['combined'].apply(lambda x: [int(i) for i in x if str(i) != "nan"])
print('\n\n')
print(df_final)

Выход

0 голосов
/ 23 октября 2019

Вы близки, делайте так.

combo = {}

with open('gene_orf_updated2.txt', 'r') as f:
    for line in f:
        name = line.split('\n')[0]
        combo[name]= []
with open('GSE139_meanCenter_results.txt', 'r') as g:
    for each in g:
        name2 = each.split('\t')[0]
        data = each.rstrip('\n').split('\t')[1:]
        if name2 in combo:
            combo[name2].append(data)

Если вы хотите удалить вложенный список, сделайте это вместо этого.

combo[name2] += data
0 голосов
/ 23 октября 2019

Как уже отмечали другие, вы не можете присоединиться к диктовке.

d = {}

После того, как вы инициализировали свой dict, вы можете добавить новые ключи, например, так:

d['new'] = 9

Вы можете перезаписать существующие ключи, выполнив это

d['new'] = 10

InВ вашей ситуации вы можете попытаться создать списки, а затем добавить их к этому.

0 голосов
/ 23 октября 2019

Итак, если вы хотите использовать .append(), вам нужно убедиться, что значение словаря, к которому вы добавляете, является списком. Похоже, вы устанавливаете его на combo[name]={}, и, таким образом, вы получаете ошибку 'dict has at attribute'. Вам, вероятно, следует попробовать изменить combo[name]={} на combo[name]=[], чтобы продолжить использовать добавление позже.

Новая правка исправления логики:

for each in g:
    # name2 = each.split('\t')[0]
    data = each.rstrip('\n').split('\t')[1:]
    for key_name in combo: # For every 'value' (each individual list) in the dictionary
        combo[key_name].append(data) # Add the this lines data. 
...