Как преобразовать список JSON в два разных столбца в файле CSV? - PullRequest
2 голосов
/ 11 апреля 2020

Это мой первый вопрос на этом впечатляющем веб-сайте, мне нужно знать, как экспортировать сложную информацию из 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

введите описание изображения здесь

Я оставил вам изображение файла CSV с проблемой в столбце B (у меня есть список но мне нужны два столбца с каждым значением ...

Я прикрепил ответ JSON, полученный от REST API

{'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 библиотеки '}] это моя последняя проблема! Спасибо за ваше время и помощь!

Ответы [ 2 ]

2 голосов
/ 11 апреля 2020

Вы можете попробовать использовать list(cat.keys())[0], list(cat.values())[0] в вашей переменной output_alert для извлечения ключа и значения отдельно.

1 голос
/ 11 апреля 2020

Вы можете использовать json_normalize, чтобы извлечь столбцы без for-l oop, а затем создать два новых столбца с извлеченными ключами и значениями из 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])

Вывод: enter image description here

...