преобразовать pandas json столбец в несколько строк - PullRequest
0 голосов
/ 09 июля 2020
data1 = {0: [{'confident': False, 'iab': 'IAB25-3'}],
 1: [{'confident': False, 'iab': 'IAB6-6'},
  {'confident': True, 'iab': 'IAB6'}],
 2: [{'confident': True, 'iab': 'IAB16-1'},
  {'confident': True, 'iab': 'IAB16'},
  {'confident': False, 'iab': 'IAB9'},
  {'confident': False, 'iab': 'IAB9-28'}]}

Вышеуказанный формат изначально был списком / json в каждой строке, имеющей = [{'sure': False, 'iab': 'IAB25-3'}, {'sure': True, 'iab' : 'IAB16'}], преобразованный в словарь с помощью to_dict (), привел к данным, указанным в начале. Основная проблема в том, что массив сбора (уверенный и iab) может быть n раз, а n неизвестно. Итак, я не могу его отформатировать.

Я очень стараюсь преобразовать его в указанный ниже формат фрейма данных, но пока не удалось.

rowid   confident    iab
0       False        IAB25-3
1       False        IAB6-6
1       True         IAB6
2       True         IAB16-1
2       True         IAB16
2       False        IAB9
2       False        IAB9-28

Любая помощь оценен.

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Вот еще один способ использования json_normalize:

dfs = []
for k, v in data1.items():
    df = pd.json_normalize(v)
    df['rowid'] = k
    dfs.append(df)

df = pd.concat(dfs).reset_index(drop='index')
print(df)


   confident      iab  rowid
0      False  IAB25-3      0
1      False   IAB6-6      1
2       True     IAB6      1
3       True  IAB16-1      2
4       True    IAB16      2
5      False     IAB9      2
6      False  IAB9-28      2
1 голос
/ 09 июля 2020

Идея состоит в том, чтобы использовать понимание списка для сглаженных значений с добавлением значения ключей к новому rowid ключу для списка словарей, поэтому возможен переход к DataFrame конструктору, если производительность важна:

df = pd.DataFrame([dict(**{'rowid':k}, **y) for k, v in data1.items() for y in v])

print (df)
   rowid  confident      iab
0      0      False  IAB25-3
1      1      False   IAB6-6
2      1       True     IAB6
3      2       True  IAB16-1
4      2       True    IAB16
5      2      False     IAB9
6      2      False  IAB9-28

Другой решение с concat и понимание dict должно быть лучше, если в словаре несколько больших DataFrames, но обычно concat с генерацией большого количества маленьких DataFrame s работает медленно:

df = (pd.concat({k: pd.DataFrame(v) for k, v in data1.items()})
        .reset_index(level=1, drop=True)
        .rename_axis('rowid')
        .reset_index())
print (df)
   rowid  confident      iab
0      0      False  IAB25-3
1      1      False   IAB6-6
2      1       True     IAB6
3      2       True  IAB16-1
4      2       True    IAB16
5      2      False     IAB9
6      2      False  IAB9-28
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...