我有一些看起来像这样的数据:
Benchmark Workload Stat1 Stat2
foo input1 1% 2%
bar input2 3% 4%
除了它更大,具有更多基准测试,更多工作负载和更多统计信息之外,因此很难对涉及提前知道可能值的任何事物进行硬编码。
有没有一种简便的方法可以将所有这些导入到python dict中,以便可以执行以下操作: stats [基准] [工作量] ['stat1']
等
答案 0 :(得分:0)
以下代码可能对您有用:
import sys
import pathlib
def import_data_from_file(path):
p = pathlib.Path(path)
root = dict()
with open(p , mode = "r") as inf:
it_inf = iter(inf)
col_heads = next(it_inf)
for row in it_inf:
row = row.strip()
row = row.split(" ")
predicate = lambda x: len(x) > 0
row = list(filter(predicate, row))
d = root
benchmark = row[0]
workload = row[1]
root.setdefault(benchmark, dict())
root[benchmark].setdefault(workload, dict())
root[benchmark][workload] = row[2:]
return (col_heads, root)
def pprint_data(d, *, sep="", file=sys.stdout):
_print = lambda *args:\
print(*args, sep=sep, file=file)
for benchmark in d.keys():
_print(benchmark)
for workload in d[benchmark].keys():
_print(4 * " ", workload)
_print(8 * " ", d[benchmark][workload])
return
col_heads, root = import_data_from_file("dfgdfgdfg.csv")
pprint_data(root)
控制台输出为:
foo
input1
['1%', '2%']
bar
input2
['3%', '4%']
答案 1 :(得分:0)
使用Pandas library有一个更简单的解决方案:
import pandas as pd
stats = pd.DataFrame(columns=['Benchmark', 'Workload', 'Stat1', 'Stat2'])
stats.Benchmark = ['foo', 'bar']
stats.Workload = ['input1', 'input2']
stats.Stat1 = ['1%', '3%']
stats.Stat2 = ['2%', '4%']
如果现在打印出数据框(stats
),它将看起来像这样:
这样做比制作嵌套词典(如您所要求的)的优势在于,与其通过写下stats[benchmark][workload]['stat1']
之类的所有列来访问数据,还可以仅使用列名和索引来访问元素元素,例如:
df.Benchmark[1]
>>> 'bar'
df.Workload[0]
>>> 'input1'
df.Stat1[0]
>>> '1%'
df.Stat2[1]
>>> '4%'
您可以像这样将CSV导入熊猫数据框:
import pandas as pd
data = pd.read_csv('path/to/file.csv')