我正在尝试将制表符分隔文件的特定列放入字典中。我正在尝试几件事,但没有给我想要的结果。
例如,我有此文件:
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
我想要的是这样的东西,其中Name是键,其他是值,此外,我还有更改标头和标头索引的问题,但它们的含义相同:
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还是很陌生,我知道必须有一个相对简单的答案,但是我似乎找不到它。抱歉,如果答案已经在堆栈溢出中,我试了几个小时才发现类似/可行的问题,这就是我真正陷入困境的关键所在。
答案 0 :(得分:1)
我认为需要使用DataFrame.set_index
按列Name
创建索引,然后使用参数orient='index'
调用DataFrame.to_dict
:
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}}
答案 1 :(得分:0)
基于@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}}