Разбить столбец словарей на новые столбцы

avatar
Birish
9 августа 2021 в 06:42
153
1
2

В моем кадре данных есть столбец словарей:

ID имя значение статистика
{'среднее': 154,0, 'медианное': 154,0, 'стандартное': 0,0}
{'среднее': 131,19, 'медианное': 93,68, 'стандартное': 53,04}

Мне нужно разбить этот столбец на новые столбцы

ID имя значение среднее медиана станд.
154,0 154,0 0,0
131,19 93,68 53,04

Я пытался использовать pd.json_normalize следующим образом:

df2 = pd.json_normalize(df['stats'])
df2

Но таким образом я теряю индексы в df2 и не могу объединить их, чтобы добавить новые столбцы в df. Как мне это сделать?

Источник
shoaib30
9 августа 2021 в 06:44
1

Можете ли вы скопировать индекс из df1 в df2?

timgeb
9 августа 2021 в 06:57
0

Не могли бы вы опубликовать полный пример с входными кадрами данных, содержащими индексы, которые вы хотите изменить?

Ответы (1)

avatar
Naga kiran
9 августа 2021 в 06:47
1

Вы можете попробовать применить pd.Series к каждому словарю, он будет преобразован как отдельный фрейм данных с последующим слиянием

pd.concat([df, df['col'].apply(pd.Series)], axis=1).drop('col',axis=1)

другой подход

df.merge(df['col'].apply(pd.Series), left_index=True, right_index=True, how='outer').drop('col',axis=1)

Пример

df = pd.DataFrame()
df['col'] = [{'mean': 154.0, 'median': 154.0, 'std': 0.0},
             {'mean': 131.19, 'median': 93.68, 'std': 53.04}]
df['some'] =1

Предыдущий

    col some
0   {'mean': 154.0, 'median': 154.0, 'std': 0.0}    1
1   {'mean': 131.19, 'median': 93.68, 'std': 53.04} 1

Выход:

    some    mean    median  std
0   1   154.00  154.00  0.00
1   1   131.19  93.68   53.04
Birish
9 августа 2021 в 06:54
0

Это добавляет много новых строк в мой фрейм данных: форма от (2896, 19) до формы = (15564, 21)

Naga kiran
9 августа 2021 в 06:56
0

возможно, из-за несоответствия индекса при слиянии, не могли бы вы поделиться фрагментом данных df json, было бы более понятно применить и проверить

Naga kiran
9 августа 2021 в 06:58
0

Я только что отредактировал вопрос, вы можете попробовать проверить его