簡體   English   中英

將嵌套字典轉換為 csv

[英]Convert nested dictionary to csv

我有一個特殊情況,我想創建一個 csv,使用嵌套字典的內部值作為鍵,內部鍵作為 header。“健康”鍵可以包含除“身高”和“體重”之外的更多子鍵,但是“不健康”將永遠包含 None 或一串值。 我現在的字典是這樣的:

{0: {'healthy': {'height': 160,
                 'weight': 180},
    'unhealthy': None},
 1: {'healthy': {'height': 170,
                'weight': 250},
    'unhealthy': 'alcohol, smoking, overweight'}
}

我如何將其轉換為 csv:

+------+--------+----------------------------+
|height|  weight|                   unhealthy|
+------+--------+----------------------------+
|160   |     180|                            |
+------+--------+----------------------------+
|170   |     250|alcohol, smoking, overweight|
+------+--------+----------------------------+

無論如何不硬編碼並在沒有 Pandas 的情況下執行此操作並將其保存到某個位置?

使用D作為您的字典,您可以將D.values()傳遞給pandas.json_normalize()並在需要時重命名列。

>>> import pandas as pd
>>> print(pd.json_normalize(D.values()).to_markdown(tablefmt='psql'))
+╌╌╌╌+╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌+╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌+╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌+
|    | unhealthy                    |   healthy.height |   healthy.weight |
|╌╌╌╌+╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌+╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌+╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌|
|  0 |                              |              160 |              180 |
|  1 | alcohol, smoking, overweight |              170 |              250 |
+╌╌╌╌+╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌+╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌+╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌+

所以這可能是一種非常愚蠢的方法,但是如果你的字典有這種結構並且你不介意對實際值進行硬編碼,這可能就是這種方式

import csv

dictionary = {0: {'healthy': {'height': 160,
                              'weight': 180},
                  'unhealthy': None},
              1: {'healthy': {'height': 170,
                              'weight': 250},
                  'unhealthy': 'alcohol, smoking, overweight'}
              }

with open("out.csv", "w") as f:
    writer = csv.writer(f)
    writer.writerow(['height', 'weight', 'unhealthy'])
    writer.writerows([
        [value['healthy']['height'],
         value['healthy']['weight'],
         value['unhealthy']
         ] for key, value in dictionary.items()])

所以關鍵是你只需創建一個[<height>, <weight>, <unhealthy>]數組 arrays 並使用 python 的內置模塊csv.writer.writerows()將其寫入 csv 文件

我用pandas處理這個值,保存為csv文件。

  1. 我將json格式數據加載為 dataframe。
  2. 通過轉置數據,我得到了“不健康”的專欄
  3. 通過使用json_normalize() ,我解析了嵌套的字典數據,'healthy' 並將兩列生成為 'height' 和 'weight'
  4. 連接“健康”和“身高”、“體重”列
  5. 將 dataframe 保存為 csv 文件。
import pandas as pd

val = {
    0: {'healthy': {'height': 160, 'weight': 180},
        'unhealthy': None},
    1: {'healthy': {'height': 170, 'weight': 250},
        'unhealthy': 'alcohol, smoking, overweight'}
}

df = pd.DataFrame.from_dict(val)
df = df.transpose()
df = pd.concat([pd.json_normalize(df['healthy'], max_level=1), df['unhealthy']], axis=1)
df.to_csv('filename.csv', index=False) # A csv file generated.

這是我生成的 csv 文件(我使用 MS Excel 打開它)。 這是csv文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM