.csv в словаре с изменением имен заголовков и индексов - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь поместить определенные столбцы файлов, разделенных табуляцией, в словарь.Я пробую несколько вещей, и ни один из них не дает мне результат, который я ищу.

У меня есть, например, этот файл:

Name   Start   End   Size
del1   100     105   5
del2   150     160   10
del3   250     300   50

и этот файл, оба .csv

Name   Qual   StartB  EndB  Size
inv1   6      400     405   5
inv2   7      450     460   10
inv3   20     450     400   50

То, что я хочу, это что-то вроде этого, где Имя является ключом, а остальные являются значениями, кроме того, у меня есть проблема изменения заголовков и индексов заголовков, но они означают одно и то же:

del_dict{del1: {Start: 100, End: 105, Size:5} del2: {etc}

Я пытался прочитать файл несколькими способами, основываясь на других ответах о переполнении стека.

for file in glob.glob(directoryname + "/*.csv"):
    dict = pd.read_csv(file, squeeze=False, sep="\t").to_dict()
        print(dict)

и

for file in glob.glob(directoryname + "/*.csv"):
    df = pd.read_csv(open(file, 'r'), header=0, sep="\t")
    if "StartB" in df.keys():
        name = df.Name
        start_pos = df.StartB
        end_pos = df.EndB
    else:
        name = df.Name
        start_pos = df.Start
        end_pos = df.End

Но это дает мне кадры данных, которые я не могу вписать вэто в словарь.

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

for file in glob.glob(directoryname + "/*.csv"):
    with open(file, 'r') as csvfile:
        csv_list = []
        for line in csvfile:
            csv_list.append(line.strip("\t"))

Я довольно новичок в Python, и я знаю, что относительно простой ответ должен быть доступен, но я не могу его найти.Извините, если ответ уже о переполнении стека, я часами пытался найти аналогичную / работоспособную проблему, и вот тут я действительно застрял.

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Основываясь на помощи и опыте @jezrael (помечен как ответ), я разместил здесь свой окончательный код, где я также объединил словари в нужном мне формате и нашел решение для столбца, которого нет в каждомфайл.

Пожалуйста, дайте мне знать, если это не способ переполнения стека.

    csv_dict = {}
    for file in glob.glob(directoryname + "/*.csv"):
        df = pd.read_csv(file, sep="\t")
        d = {'StartB': 'Start', 'EndB': 'End'}
        if "Duplications" in df.keys():
            d = df.set_index('Name').rename(columns=d)[['Start', 'End', 'Size', 'Duplications']].to_dict(orient='index')
            csv_dict.update(d)
        else:
            d = df.set_index('Name').rename(columns=d)[['Start', 'End', 'Size']].to_dict(orient='index')
            csv_dict.update(d)
    print(csv_dict)

результат:

{'del1': {'Start': 969261, 'End': 969270, 'Size': 10}, 
'del2': {'Start': 641573, 'End': 641672, 'Size': 100}, 
'del3': {'Start': 998620, 'End': 999119, 'Size': 500}, 
'dup1': {'Start': 595662, 'End': 595671, 'Size': 10, 'Duplications': 3}, 
'dup2': {'Start': 321225, 'End': 321324, 'Size': 100, 'Duplications': 3}, 
'dup3': {'Start': 971634, 'End': 972133, 'Size': 500, 'Duplications': 10}, 
'inv1': {'Start': 818450, 'End': 818459, 'Size': 10}, 
'inv2': {'Start': 991098, 'End': 991197, 'Size': 100},
'inv3': {'Start': 219635, 'End': 220134, 'Size': 500}}
0 голосов
/ 01 октября 2018

Я думаю, нужно создать индекс по столбцу Name с DataFrame.set_index, а затем вызвать DataFrame.to_dict с параметром orient='index':

df = pd.read_csv(file,  sep="\t")

d = df.set_index('Name').to_dict(orient='index')
print (d)
{'del1': {'Start': 100, 'End': 105, 'Size': 5},
 'del2': {'Start': 150, 'End': 160, 'Size': 10},
 'del3': {'Start': 250, 'End': 300, 'Size': 50}}

РЕДАКТИРОВАТЬ - Вы можете переименовать имена столбцов по словарю и выбрать по столбцам списка для экспорта в dict:

d = {'StartB':'Start','EndB':'End'}
d = df.set_index('Name').rename(columns=d)[['Start','End','Size']].to_dict(orient='index')
print (d)
{'inv1': {'Start': 400, 'End': 405, 'Size': 5}, 
 'inv2': {'Start': 450, 'End': 460, 'Size': 10}, 
 'inv3': {'Start': 450, 'End': 400, 'Size': 50}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...