我正在尝试将制表符分隔文件的特定列放入字典中。我正在尝试多种方法,但没有一种能给我想要的结果。
例如我有这个文件:
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 的新手,我知道必须有一个相对简单的答案,但我似乎找不到它。抱歉,如果答案已经在堆栈溢出,我尝试了几个小时来寻找类似/可行的问题,这就是我真正陷入困境的地方。
最佳答案
我认为需要使用 DataFrame.set_index
按 Name
列创建索引然后调用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}}
编辑 - 您可以按字典重命名列名称并按列表列选择以导出到字典:
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}}
关于python - 字典中的 .csv 具有更改的标题名称和索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52590383/