Для создания цикла в фрейме данных pandas

#python-3.x #pandas #dataframe

#python-3.x #pandas #фрейм данных

Вопрос:

У меня есть следующий фрагмент кода, и он работает, но выводит данные как положено. Я пытаюсь (безуспешно) поместить результаты в фрейм данных, чтобы я мог экспортировать результаты в файл csv. Я просматриваю файл json, и результаты верны, мне просто нужны два столбца, которые выводятся на печать, чтобы перейти в фрейм данных вместо печати результатов. Я удалил код, который вызывал ошибку, чтобы он выполнялся.

 import json
import requests
import re 
import pandas as pd

data = {}
df = pd.DataFrame(columns=['subtechnique', 'name'])
df

RE_FOR_SUB_TECHNIQUE = r"(Td ).(d )"
r = requests.get('https://raw.githubusercontent.com/mitre/cti/master/enterprise-attack/enterprise-attack.json', verify=False)

data = r.json()

objects = data['objects']
for obj in objects:
    ext_ref = obj.get('external_references',[])
    revoked = obj.get('revoked') or '*****'
    subtechnique = obj.get('x_mitre_is_subtechnique')
    name = obj.get('name')    
    for ref in ext_ref:
        ext_id = ref.get('external_id') or ''
        if ext_id:
            re_match = re.match(RE_FOR_SUB_TECHNIQUE, ext_id)
            if re_match:
                technique = re_match.group(1)
                sub_technique = re_match.group(2)
                print('{},{}'.format(technique '.' sub_technique, name))
     
  

Если только не существует более простого способа поместить результаты каждой строки в цикл и добавить их в файл csv.

Любая помощь приветствуется.

Спасибо

Ответ №1:

В этом случае, вероятно, проще просто записать csv-файл напрямую, а не проходить через Pandas:

 with open("enterprise_attack.csv", "w") as f:
    my_writer = csv.writer(f)   
    for obj in objects:
        ext_ref = obj.get('external_references',[])
        revoked = obj.get('revoked') or '*****'
        subtechnique = obj.get('x_mitre_is_subtechnique')
        name = obj.get('name')
        for ref in ext_ref:
            ext_id = ref.get('external_id') or ''
            if ext_id:
                re_match = re.match(RE_FOR_SUB_TECHNIQUE, ext_id)
                if re_match:
                    technique = re_match.group(1)
                    sub_technique = re_match.group(2)
                    print('{},{}'.format(technique '.' sub_technique, name))
                    my_writer.writerow([technique "." sub_technique, name])
  

Следует отметить, что вышеуказанное приведет к перезаписи выходных данных любых предыдущих запусков. Если вы хотите сохранить выходные данные нескольких запусков, измените режим файла на «a»:

 with open("enterprise_attack.csv", "a") as f:
  

Комментарии:

1. Это работает по большей части, но я получаю возврат на выходе, как я могу избавиться от дополнительного возврата

2. Что вы подразумеваете под возвратом?

3. когда я запускаю код, я получаю это, после каждой строки происходит возврат каретки, и мне нужно, чтобы это исчезло (если возможно). Все примеры являются поддельными только для отображения результатов T123.1234, Name1 n T125.3902, Name2 nm это должно быть T123.1234 Name1 T125.1256 Name2 Я не могу показать это здесь, но между результатами есть пустая строка, и эта пустая строка должна быть gong.

4. Ах, теперь я понимаю. Измените первую строку на with open("enterprise_attack.csv", "w", newline='') as f:

5. Спасибо, Эдунн, именно то, что мне было нужно