python - 将数据结构转换为csv

标签 python python-2.7 csv

我有一个如下所示的数据结构,我需要将其转换为 csv 文件。我希望这些列以某种方式排序。

输入数据结构

{
       "total": {
              "a": 300, 
              "c": 300, 
              "b": 300, 
              "e": 300, 
              "d": 300
       }, 
       "japan": {
              "a": 12, 
              "c": 130, 
              "b": 223, 
              "e": 10, 
              "d": 51
       }, 
       "america": {
              "a": 1, 
              "c": 10, 
              "b": 2, 
              "e": 20, 
              "d": 5
       }, 
       "china": {
              "a": 1, 
              "c": 5, 
              "b": 23, 
              "e": 11, 
              "d": 9
       }
}

所需输出

category,total,japan,china,america
a,300,12,1,1
b,300,223,23,2
c,300,130,5,10
d,300,51,9,5
e,300,10,11,20
cat_total,1500,426,49,87
percentage,,28.4,0.032,0.058

百分比公式(例如日本)

percentage = 426/1500 * 100
where 426 is cat_total of Japan and 1500 is cat_total of total column

我能够想出的代码如下所示

import csv
import sys

my_dict = { 'america' : { 'a' : 1,
                             'b' : 2,
                             'c' : 10,
                             'd' : 5,
                             'e' : 20
                            },
            'japan' : { 'a' : 12,
                             'b' : 223,
                             'c' : 130,
                             'd' : 51,
                             'e' : 10
                            },
            'total': {'a': 300,
                      'b': 300,
                      'c': 300,
                      'd': 300,
                      'e': 300,
                      },
            'china': {'a': 1,
                      'b': 23,
                      'c': 5,
                      'd': 9,
                      'e': 11
                      },

            }


category = set([c for country in my_dict for c in my_dict[country].keys()])


data_to_write = list()

for cat in category:
    temp = list()
    temp.append(cat)
    for country_name in my_dict:
        temp.append(my_dict[country_name][cat])
    data_to_write.append(temp)

csvfile = csv.writer(sys.stderr)
for row in data_to_write:
    csvfile.writerow(row)

我的要求

  1. 需要计算 cat_total 和百分比行。
  2. 我希望将类别、总计和日本作为 csv 的前三列,并且可以接受其余列的任意顺序
  3. 对于行,我希望 cat_total 作为倒数第二个,百分比作为最后一列。

如果有人能在这方面帮助我,那就太好了。谢谢

最佳答案

下面是一个纯 python 解决方案,然后可以像您已经完成的那样将其传递给 csv 编写器。

# Get complete set of all keys used in sub-dictionaries (e.g. 'a', 'b', 'c', 'd' and 'e').
subkeys = set()
for k in d:
    subkeys.update(d[k].keys())
subkeys = sorted(subkeys)

# Get columns in desired order.
cols = ['category', 'total', 'japan']
cols += [k for k in d if k not in cols]

# Arrange data as a matrix.
data = [[k] + [d[col].get(k, 0) for col in cols[1:]] for k in subkeys]

# Add totals for each column.
data.append(['cat_total'] + [sum(row[col] for row in data) 
                             for col in range(1, len(d.keys()) + 1) ])

# Calculate percentage of total.
factor = 100. / data[-1][1]
data.append(['percentage', ''] + [round(n * factor, 3) for n in data[-1][2:]])

data_to_write = data
>>> data_to_write
[['a', 300, 12, 1, 1],
 ['b', 300, 223, 23, 2],
 ['c', 300, 130, 5, 10],
 ['d', 300, 51, 9, 5],
 ['e', 300, 10, 11, 20],
 ['cat_total', 1500, 426, 49, 38],
 ['percentage', '', 28.4, 3.267, 2.533]]

关于python - 将数据结构转换为csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46225699/

相关文章:

python - 解码字符 Pandas

python - 如何解析 Python (2.7) 中可能有或没有小数秒的时间?

mysql - 使用单个查询从 mysql 表中删除 csv 文件值

python - Google App Engine 应用统计

python - 树遍历并在Python中获取相邻的子节点

python - 使用python关闭计算机(linux)

java - 使用java读取apache beam中的多个csv文件

python - CSV文件解析(python)

python - Django Rest Framework JWT 单元测试

javascript - Python Pillow 库对本地主机不可见