2017-02-13 3 views
0

사전의 3 차원 독재로 저장된 여러 메트릭을 계산하는 코드가 있습니다. 이 사전을 csv 파일에 인쇄하고 싶습니다. 그러나 이렇게 좋은 방법을 찾지 못했습니다.다차원 사전을 파일로 작성

일단 사전 내의 모든 요소를 ​​계산, 나는 (- 열 키와 열 측정 다른 periods을 열 수 있어야 파일의 헤더와 keys 및 메트릭 a, b, and c 곳)가 파일로 인쇄하고 싶습니다.

파일로 인쇄하는 쉬운 방법이 있습니까? (내 첫 번째 시도는 팬더했지만이 작동하지 않았다)

감사

from collections import defaultdict 
import pandas as pd 
import os 
import random 


# 3 dimensional dictionary that stores integers 
output_dict = defaultdict(lambda: defaultdict(lambda: defaultdict(int))) 
# Array of periods 
periods = range(0, 2) 
# relevant keys 
keys = ["key1", "key2"] 

# Iterate over all periods 
for period in periods: 
    # Iterate over all relevant keys 
    for key in keys: 

     # Store results for key for each time period for each category ("a", "b", or "c") 
     output_dict[key][period]["a"] += random.randint(1, 1000) 
     output_dict[key][period]["b"] += random.randint(1, 1000) 
     output_dict[key][period]["c"] += random.randint(1, 1000) 

# This is the tricky part!!! 
# Store results 
pd.DataFrame(output_dict).to_csv("output_dict.csv", index=False) 

# the dictionary may look as follows: 
output_dict = {"key1": {0: {"a": 0.9, "b": 0.2, "c": 0.5}, 1:{"a": 0.91, "b": 0.3, "c": 0.4}}, 
       "key2": {0: {"a": 0.4, "b": 0.33, "c": 0.34}, 1: {"a": 0.21, "b": 0.73, "c": 0.54}}} 

enter image description here

+1

첫째,와 팬더 Dataframe에 데이터를 변환 시도 'key','a','b','c'의 열. 그런 다음 CSV에 투기하는 것은 상당히 힘들어 야합니다. –

+1

사전이 어떻게 생겼는지 예를 보여주고 csv를 어떻게 보이게 할 지 알려주는 것이 도움이 될 것입니다. –

+0

@JackManey : 팬더에서 쉽게 할 수있는 방법이 있습니까? – Andreas

답변

1
당신은 그냥이의 csv 모듈을 사용한다

, 나는에 데이터를 논쟁 가치가 있다고 생각하지 않습니다 pandas DataFrame 생성자를 사용하여 멋지게 재생할 수 있습니다. 참고, 결과를 쉽게 인쇄 할 수 있도록 파일 대신 문자열 i/o 버퍼에 csv를 쓰고 있지만 단순히 그 파일을 생략하고 일반 파일 객체로 작업 할 수 있습니다.

>>> periods = [0, 1] 
>>> metrics = ['a', 'b', 'c'] 
>>> import csv 
>>> import io 

이제 단지 신중하게 행을 구축 : 사전은 순서가 있기 때문에

>>> with io.StringIO() as f: 
...  writer = csv.writer(f) 
...  writer.writerow(['Key','Metric', 0, 1]) 
...  for key in output_dict: 
...   for metric in metrics: 
...    row = [key, metric] 
...    for p in periods: 
...     row.append(output_dict[key][p][metric]) 
...    writer.writerow(row) 
...  final = f.getvalue() 
... 
16 
17 
18 
18 
17 
16 
16 
>>> print(final) 
Key,Metric,0,1 
key2,a,0.4,0.21 
key2,b,0.33,0.73 
key2,c,0.34,0.54 
key1,a,0.9,0.91 
key1,b,0.2,0.3 
key1,c,0.5,0.4 

주, 키는 특정 순서로하지 않습니다. 메트릭 및 마침표와 같이 미리 알기 만하면 모든 키를 반복하여 순서를 지정할 수 있습니다. 질문에 은 미리 알았으므로입니다. 이 솔루션은 누락 된 키를 처리하기 위해 확장 될 수 있습니다.

편집는 : 귀하의 마지막 편집 그래서 그냥 같은 일을 할, 당신은 사전의 키를 알 수 있음을 암시하는 것 같다

>>> periods = [0, 1] 
>>> keys = ['key1', 'key2'] 
>>> metrics = ['a', 'b', 'c'] 
>>> with io.StringIO() as f: 
...  writer = csv.writer(f) 
...  writer.writerow(['Key','Metric', 0, 1]) 
...  for key in keys: 
...   for metric in metrics: 
...    row = [key, metric] 
...    for p in periods: 
...     row.append(output_dict[key][p][metric]) 
...    writer.writerow(row) 
...  final = f.getvalue() 
... 
16 
17 
16 
16 
17 
18 
18 
>>> print(final) 
Key,Metric,0,1 
key1,a,0.9,0.91 
key1,b,0.2,0.3 
key1,c,0.5,0.4 
key2,a,0.4,0.21 
key2,b,0.33,0.73 
key2,c,0.34,0.54 
+0

고맙습니다. 이것은 내가 찾고 있었던 바로 그 것이다! 게시물에 관한 두 가지 질문 : a) CSV 파일에'final'을 쓰려면 어떻게해야합니까? b) "writerow"기능을 동적으로 만들 수있는 쉬운 방법이 있습니다 (예 : 무제한 기간 있음). – Andreas

관련 문제