Создайте список с элементами из пары вложенных значений ключа dict - PullRequest
0 голосов
/ 06 октября 2018

Я хотел бы создать новый список с элементами из большого вложенного слова.

Вот фрагмент вложенного слова:

AcceptedAnswersPython_combined.json

{
  "items": [
    {
      "answers": [
        {
          "creation_date": 1533083368,
          "is_accepted": false
        },
        {
          "creation_date": 1533083567,
          "is_accepted": false
        },
        {
          "creation_date": 1533083754,
          "is_accepted": true
        },
        {
          "creation_date": 1533084669,
          "is_accepted": false
        },
        {
          "creation_date": 1533089107,
          "is_accepted": false
        }
      ],
      "creation_date": 1533083248,
      "tags": [
        "python",
        "pandas",
        "dataframe"
      ]
    },
    {
      "answers": [
        {
          "creation_date": 1533084137,
          "is_accepted": true
        }
      ],
      "creation_date": 1533083367,
      "tags": [
        "python",
        "binary-search-tree"
      ]
    }
  ]
} 

Новый список должен содержать creation_date каждогопункт столько раз, сколько есть диктовок в списке answers.Так что в случае фрагмента кода выше новый список должен выглядеть следующим образом:

question_date_per_answer = [[1533083248, 1533083248, 1533083248 , 1533083248, 1533083248], [1533083367]]

Причина, по которой мне нужен этот новый список, заключается в том, что я хотел бы определить разницу между каждым answers creation_dateи связанный с ним вопрос creation_date (изложенный внутри каждого items dict).

Этот новый список должен выглядеть следующим образом в пандах. Dataframe:

     question creation date answer creation date  
0          1533083248             1533083368               
1          1533083248             1533083567               
2          1533083248             1533083754                
3          1533083248             1533084669               
4          1533083248             1533089107               
5          1533083367             1533084137

Я могу перебирать все вопросы примерно так:

items = json.load(open('AcceptedAnswersPython_combined.json'))['items']
question_creation_date = [item['creation_date'] for item in items]

Но это оставляет меня ссписок, который не равен числу answers creation_date.

Я не могу разобраться с этим.
Так как мне создать такой список, в котором количество дат создания вопроса равноравно количеству дат создания ответа?(вроде question_date_per_answer)

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Вы все еще можете работать со списком под рукой.
Давайте попробуем создать кадр данных из списка, который у вас уже есть -

l = [[1533083248, 1533083248, 1533083248 , 1533083248, 1533083248], [1533083367]]
df = pd.DataFrame(l)

К сожалению, вы получаете следующее -

0   1   2   3   4
0   1533083248  1.533083e+09    1.533083e+09    1.533083e+09    1.533083e+09
1   1533083367  NaN     NaN     NaN     NaN

Так что нам нужно перенести это.Для этого давайте сделаем следующее -

from itertools import zip_longest
k = list(list(zip_longest(*l))) #Unless the list will be truncated to the length of shortest list.
df = pd.DataFrame(k)

Output-

0   1
0   1533083248  1.533083e+09
1   1533083248  NaN
2   1533083248  NaN
3   1533083248  NaN
4   1533083248  NaN

Теперь мы будем вперед заполнить NaN предыдущим значением на - df.fillna(method='ffill')
Весь фрагмент -

from itertools import zip_longest
l=[1533083248, 1533083248, 1533083248 , 1533083248, 1533083248], [1533083367]
k=list(list(zip_longest(*l)))
df = pd.DataFrame(k)
df.fillna(method='ffill')

Вуаля -

    0   1
0   1533083248  1.533083e+09
1   1533083248  1.533083e+09
2   1533083248  1.533083e+09
3   1533083248  1.533083e+09
4   1533083248  1.533083e+09
0 голосов
/ 06 октября 2018

вам нужно перебрать элемент ["answers"] и затем получить creation_date для каждого ответа в oreder, чтобы получить даты создания ответа.

my_json = """{
"items": [
    {
    "answers": [
        {
        "creation_date": 1533083368,
        "is_accepted": false
        },
        {
        "creation_date": 1533083567,
        "is_accepted": false
        },
        {
        "creation_date": 1533083754,
        "is_accepted": true
        },
        {
        "creation_date": 1533084669,
        "is_accepted": false
        },
        {
        "creation_date": 1533089107,
        "is_accepted": false
        }
    ],
    "creation_date": 1533083248,
    "tags": [
        "python",
        "pandas",
        "dataframe"
    ]
    },
    {
    "answers": [
        {
        "creation_date": 1533084137,
        "is_accepted": true
        }
    ],
    "creation_date": 1533083367,
    "tags": [
        "python",
        "binary-search-tree"
    ]
    }
]
}"""

import json

data = json.loads(my_json)
dates = [(question["creation_date"], answer["creation_date"])
         for question in data["items"] for answer in question["answers"]]
print(dates)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...