我有一个Python程序,在其中扫描多个参数,并在每个点计算一些结果。然后,我想以CSV(或Excel)报告的形式导出结果,该报告的每一行均包含参数和结果。例如,在这里我扫描两个参数i
和j
并根据res1
和res2
来计算i
和j
。 (尽管这完全是愚蠢的MWE!)
res1 = dict()
res2 = dict()
for i in range(5):
res1[i] = dict()
res2[i] = dict()
for j in range(5):
res1[i][j] = i+j
res2[i][j] = i*j
我想创建一个包含25行和4列的CSV,其中前两列是(i, j)
组合,为此计算了res1
和res2
,后两列是{{ 1}}和res1
。导出此类CSV的一种简单方法如下:
res2
我想知道是否可以通过字典创建#### Naive CSV writing
print(', '.join(['i', 'j', 'res1', 'res2']))
for i in range(5):
for j in range(5):
print(', '.join([str(i), str(j), str(res1[i][j]), str(res2[i][j])]))
框架,以便我可以更轻松地导出报告?
我知道pandas
构造函数接受一个字典,该字典将列标题映射到列值。因此,例如,以下是可能的解决方案:
pandas.DataFrame
但是,上面的内容看起来并不那么优雅(我认为效率也不高)。有更好的方法吗?
答案 0 :(得分:1)
您可以创建普通列表
data = []
for i in range(5):
for j in range(5):
data.append([i, j, res1[i][j], res2[i][j]])
然后转换为DataFrame
import pandas as pd
df = pd.DataFrame(data, columns=['i', 'j', 'res1', 'res2'])
print(df)
或使用csv
模块直接编写
import csv
fh = open("output.csv", 'w')
csvwriter = cvs.writer(fh)
csvwriter.writerow(['i', 'j', 'res1', 'res2'])
for i in range(5):
for j in range(5):
csvwriter.writerow([i, j, res1[i][j], res2[i][j]])
fh.close()
答案 1 :(得分:0)
如何?
import pandas as pd
from itertools import product
p = np.array(list(product(range(5), range(5))))
df = pd.DataFrame(data={'i': p[:,0], 'j':p[:,1]})
def res(row):
row['res1'] = res1(row['i'], row['j'])
row['res2'] = res2(row['i'], row['j'])
return row
df = df.apply(res, axis=1)
现在您可以将数据帧直接写入csv