【问题标题】:How to convert a JSON list into two different columns in a CSV file?如何将 JSON 列表转换为 CSV 文件中的两个不同列?
【发布时间】:2020-07-24 03:19:38
【问题描述】:

这是我在这个壮观的网站上的第一个问题,我需要知道如何将复杂信息从 JSON 导出到 CSV。 问题是我需要从列中的列表中获得两个不同的值。

我尝试了很多不同的组合,但我做不到,所以我最后的资源之一被要求提供给社区。 我的代码是这样的:

def output(alerts):
        output = list()
        for alert in alerts:
            applications = alerts['applications']
            for app in applications:
                categories = app['categories']
                for cat in categories:
                    output_alert = [list(cat.items())[0], app['confidence'], app['icon'],
                                    app['name'], app['version'], app['website'], alerts['language'], alerts['status']]
                    output.append(output_alert)

        df = pd.DataFrame(output, columns=['Categories', 'Confidence', 'Icon', 'Name', 'Version', 'Website',
                                           'Language', 'Status'])
        df.to_csv(args.output)
        print('Scan completed, you already have your new CSV file')
        return

enter image description here

我在 B 列中给你留了一张 CSV 文件的图片(我在那里有一个列表),但实际上我需要两列,每个值...

我附加了来自 REST API 的 JSON 响应

{'applications': [{'categories': [{'59': 'JavaScript libraries'}],
               'confidence': '100',
               'icon': 'Lo-dash.png',
               'name': 'Lodash',
               'version': '4.17.15',
               'website': 'http://www.lodash.com'},
              {'categories': [{'12': 'JavaScript frameworks'}],
               'confidence': '100',
               'icon': 'RequireJS.png',
               'name': 'RequireJS',
               'version': '2.3.6',
               'website': 'http://requirejs.org'},
              {'categories': [{'13': 'Issue trackers'}],
               'confidence': '100',
               'icon': 'Sentry.svg',
               'name': 'Sentry',
               'version': '4.6.2',
               'website': 'https://sentry.io/'},
              {'categories': [{'1': 'CMS'},
                              {'6': 'Ecommerce'},
                              {'11': 'Blogs'}],
               'confidence': '100',
               'icon': 'Wix.png',
               'name': 'Wix',
               'version': None,
               'website': 'https://www.wix.com'},
              {'categories': [{'59': 'JavaScript libraries'}],
               'confidence': '100',
               'icon': 'Zepto.png',
               'name': 'Zepto',
               'version': None,
               'website': 'http://zeptojs.com'},
              {'categories': [{'19': 'Miscellaneous'}],
               'confidence': '100',
               'icon': 'webpack.svg',
               'name': 'webpack',
               'version': None,
               'website': 'https://webpack.js.org/'},
              {'categories': [{'12': 'JavaScript frameworks'}],
               'confidence': '0',
               'icon': 'React.png',
               'name': 'React',
               'version': None,
               'website': 'https://reactjs.org'}],  'language': 'es',  'status': 'success'}

[{'59': 'JavaScript library'}] 最后这件事是我的大问题!感谢您的时间和帮助!

【问题讨论】:

    标签: python json csv dataframe parsing


    【解决方案1】:

    您可以使用json_normalize 在没有 for 循环的情况下提取列,然后使用从 categories 提取的键和值创建两个新列:

    result = pd.json_normalize(
        alerts,
        record_path=["applications"],
        meta=["language", "status"]
    ).explode("categories")
    
    result["category_labels"] = result.categories.apply(lambda x: list(x.keys())[0])
    result["category_values"] = result.categories.apply(lambda x: list(x.values())[0])
    

    输出是:

    【讨论】:

    • 很好的资源,谢谢!我不知道那个功能
    • 太好了,很高兴我能帮上忙!它似乎不是一个众所周知的功能,但它帮助了我很多次。无论如何,如果此解决方案对您有用,请考虑接受答案,以便其他人知道使用它。
    【解决方案2】:

    您可以尝试在您的output_alert 变量中使用list(cat.keys())[0], list(cat.values())[0] 来分别提取键和值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-30
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 2019-07-30
      相关资源
      最近更新 更多