首页 > 解决方案 > 通过检查标题将字典转换为 CSV

问题描述

我有一个很长的dict,它是由元组列表的边距创建的。这dict包含列表中的值 - 所以它有一个顺序,比如

 value:key1, value:key2, value:key3, value:key1, value:key2, value:key3

但这不是规则!例如,有些地方没有 a,有些key2地方是key4。这values有不同的键。

所以看起来很像这样

 value:key1, value:key2, value:key1, value:key2, value:key4

我想从这些数据中创建一个 csv 文件。我想查看dict,查看键,将这些键添加到 csv 标头,如果它不包含该键并为该键添加值,none如果没有值。

所以我有这个

{'www.example1.com': 'url', 'FAILURE TO APPEAR (FOR FELONY OFFENSE) - FELONY': 'Charge', 'SIMULTANEOUS POSSESSION OF DRUGS AND FIREARMS - FELONY': 'Offense Date', 'POSSESSION WITH INTENT TO DELIVER METHAMPHETAMINE OR COCAINE': 'Court Type', 'Count=3': 'Court Date', '10-30-2019': 'Bond', '11-16-2019': 'Charging Agency', '': 'DEGREE', '181680713': 'ID', '24': 'Age', 'H': 'Race', 'M': 'Sex', 'BRO': 'Eye Color', 'BLK': 'Hair Color', '175 lb (79 kg)': 'Weight', '5′ 10″ (1.78 m)': 'Height', 'address example': 'Address', '11/16/2019 at 22:07': 'Admit Date', 'Benton Co': 'Confining Agency', 

'www.example2.com': 'url', '32-5a-191.4': 'STATUTE', '000-0000 (ALABAMA STATE TROOPERS)': 'COURT CASE NUMBER', 'IGNITION INTERLOCK VIOLATION': 'Description', 'V': 'LEVEL', '$1000.00': 'Bond Set Amount', '181727213': 'ID', 'name example': 'Name', 'W': 'Race', 'MALE': 'Gender', 'Released': 'Inmate Status', 'some number': 'Booking No', 'some number': 'Inmate Number', '11/18/2019 at 16:49': 'Booking Date', '11/18/2019 at 20:35': 'Release Date', '33': 'Arrest Age', 'some address': 'Address Given'}

我想要一个这样的csv文件


         url        |      Charge    |   Statute      
1  www.example1.com     SIMULTANEOUS       none
2  www.example2.com        none         32-5a-191.4

标题中的顺序并不重要。

我试过这段代码,但它覆盖了第一行的数据,没有附加......

res = defaultdict(list)

d = dict((y, x) for x, y in my_dict)
for key, val in sorted(d.items()):
    res[val].append(key)


df = pd.DataFrame.from_dict(res, orient='index').fillna(np.nan).T
df.to_csv("file.csv")

标签: pythonpython-3.xpandascsv

解决方案


在您的示例中,我看到每个新行都以 url 开头。

我认为这段代码可以做到。

from collections import defaultdict
import pandas as pd

my_dict = {
    'www.example1.com': 'url', 
    'FAILURE TO APPEAR (FOR FELONY OFFENSE) - FELONY': 'Charge', 
    'SIMULTANEOUS POSSESSION OF DRUGS AND FIREARMS - FELONY': 'Offense Date', 
    'POSSESSION WITH INTENT TO DELIVER METHAMPHETAMINE OR COCAINE': 'Court Type', 
    'Count=3': 'Court Date', 
    '10-30-2019': 'Bond', 
    '11-16-2019': 'Charging Agency', 
    '': 'DEGREE', 
    '181680713': 'ID', 
    '24': 'Age', 
    'H': 'Race', 
    'M': 'Sex', 
    'BRO': 'Eye Color', 
    'BLK': 'Hair Color', 
    '175 lb (79 kg)': 'Weight', 
    '5′ 10″ (1.78 m)': 'Height', 
    'address example': 'Address', 
    '11/16/2019 at 22:07': 'Admit Date', 
    'Benton Co': 'Confining Agency', 

    'www.example2.com': 'url', 
    '32-5a-191.4': 'STATUTE', 
    '000-0000 (ALABAMA STATE TROOPERS)': 'COURT CASE NUMBER', 
    'IGNITION INTERLOCK VIOLATION': 'Description', 
    'V': 'LEVEL', 
    '$1000.00': 'Bond Set Amount', 
    '181727213': 'ID', 
    'name example': 'Name', 
    'W': 'Race', 
    'MALE': 'Gender', 
    'Released': 'Inmate Status', 
    'some number': 'Booking No', 
    'some number': 'Inmate Number', 
    '11/18/2019 at 16:49': 'Booking Date', 
    '11/18/2019 at 20:35': 'Release Date', 
    '33': 'Arrest Age', 
    'some address': 'Address Given'
}

items = []

curr_dict = None

for key in my_dict.keys():
    new_key = my_dict[key]
    new_value = key if key else 'None'

    if new_key == 'url':
        curr_dict = {}
        items.append(curr_dict)

    curr_dict[new_key] = new_value

df = pd.DataFrame(items).fillna('None')
df.to_csv("file.csv", index = False)

推荐阅读