Как взорвать (или выскочить) массив JSON дважды - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь получить документы MongoDB, которые состоят из массива JSON, используя pop, обычно это работает хорошо, если документы MongoDB только JSON, в массиве JSON получается слишком много столбцов, поэтому я не могу открыть не-JSON формат легко. для более подробного вопроса приведу объяснение ниже

Вот мои данные

Id locations
1   [{'timestamp': 2018-05-28 15:00:00, 'lat': 0.0..
2   [{'timestamp': 2018-05-28 15:00:00, 'lat': 0.0..

Что я пытаюсь всплыть

df = df.join(pd.DataFrame(df.pop('locations').values.tolist(), index=df.index))

Выход

Id   0                              1                            ...      136
1   {'timestamp': 2018-05-28...    {'timestamp': 2018-05-28...           {'timestamp': 2018-05-28... 
2   {'timestamp': 2018-05-28...    {'timestamp': 2018-05-28...           None 

Результат, который я ожидал, равен

Id   0                             
1   {'timestamp': 2018-05-28... 
1.  {'timestamp': 2018-05-28... 
    ...
    {'timestamp': 2018-05-28... 
2   {'timestamp': 2018-05-28...
    ...
    {'timestamp': 2018-05-28...

Итак, я могу снова всплыть

1 Ответ

0 голосов
/ 25 июня 2018

думаю нужно melt:

df2 = df.join(pd.DataFrame(df.pop('locations').values.tolist(), index=df.index)).melt('Id')

Или stack:

s = (pd.DataFrame(df.pop('locations').values.tolist(), index=df.index)
       .stack()
       .reset_index(level=1, drop=True))

df2 = df.join(s.rename('new'))

Или просто решение с повторяющимися значениями Id и вложенным расширением list s:

df2 = pd.DataFrame({
        "Id": np.repeat(df.Id.values, df.locations.str.len()),
        "new": list(chain.from_iterable(df.locations))})
print (df2)
   Id                                               new
0   1  {'timestamp': '2018-05-28 15:00:00', 'lat': 0.0}
1   1  {'timestamp': '2018-05-28 16:00:00', 'lat': 0.0}
2   2  {'timestamp': '2018-05-28 10:00:00', 'lat': 0.0}
3   2  {'timestamp': '2018-05-28 17:00:00', 'lat': 0.0}
4   2  {'timestamp': '2018-05-28 18:00:00', 'lat': 0.0}

Настройка

df = pd.DataFrame({'Id':[1,2], 
                   'locations':[[{'timestamp': '2018-05-28 15:00:00', 'lat': 0.0}, {'timestamp': '2018-05-28 16:00:00', 'lat': 0.0}],
                                [{'timestamp': '2018-05-28 10:00:00', 'lat': 0.0}, {'timestamp': '2018-05-28 17:00:00', 'lat': 0.0}, {'timestamp': '2018-05-28 18:00:00', 'lat': 0.0}]]})
print (df)


   Id                                          locations
0   1  [{'timestamp': '2018-05-28 15:00:00', 'lat': 0...
1   2  [{'timestamp': '2018-05-28 10:00:00', 'lat': 0...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...