Свести вложенный JSON и объединить с фреймом данных с помощью pandas - PullRequest
1 голос
/ 04 августа 2020

Я искал много похожих тем в Интернете, но пока не нашел решения.

Мой pandas фрейм данных выглядит так:

index    FOR
0        [{'id': '2766', 'name': '0803 Computer Softwar...
1        [{'id': '2766', 'name': '0803 Computer Softwar...
2        [{'id': '2766', 'name': '0803 Computer Softwar...
3        [{'id': '2766', 'name': '0803 Computer Softwar...
4        [{'id': '2766', 'name': '0803 Computer Softwar...

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

index   id      name
0       2766    0803 Computer Software

Я нашел аналогичное решение здесь . К сожалению, я получил "TypeError" следующего вида: TypeError: объект JSON должен быть str, bytes или bytearray, а не 'list'

Мой код был:

dfs = []
for i in test['FOR']:
    data = json.loads(i)
    dfx = pd.json_normalize(data)
    dfs.append(dfx)   

df = pd.concat(dfs).reset_index(inplace = True)
print(df)

Кто-нибудь может мне здесь помочь? Спасибо большое!

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

попробуйте использовать literal_eval из стандартной библиотеки ast.

from ast import literal_eval


df_flattened = pd.json_normalize(df['FOR'].map(literal_eval))

затем удалите дубликаты.

print(df_flattened.drop_duplicates())

     id                    name
0  2766  0803 Computer Software
0 голосов
/ 25 августа 2020

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

chuck = []

for i in range(len(test)):
    chuck.append(json_normalize(test.iloc[i,:]['FOR']))

test_df = pd.concat(chuck)

А затем удалите повторяющиеся столбцы для test_df

...