У меня есть данные, сохраненные в базе данных postgreSQL. Я запрашиваю эти данные с помощью Python2.7 и превращаю их в Pandas DataFrame. Однако последний столбец этого информационного кадра содержит словарь (или список?) Значений внутри него. DataFrame выглядит следующим образом:
[1] df
Station ID Pollutants
8809 {"a": "46", "b": "3", "c": "12"}
8810 {"a": "36", "b": "5", "c": "8"}
8811 {"b": "2", "c": "7"}
8812 {"c": "11"}
8813 {"a": "82", "c": "15"}
Мне нужно разделить этот столбец на отдельные столбцы, чтобы DataFrame выглядел следующим образом:
[2] df2
Station ID a b c
8809 46 3 12
8810 36 5 8
8811 NaN 2 7
8812 NaN NaN 11
8813 82 NaN 15
Основная проблема, с которой я сталкиваюсь, заключается в том, что списки имеют разную длину. Но все списки содержат только до 3 одинаковых значений: a, b и c. И они всегда появляются в одном и том же порядке (первое, второе, третье).
Следующий код используется для работы и возврата именно то, что я хотел (df2).
[3] df
[4] objs = [df, pandas.DataFrame(df['Pollutant Levels'].tolist()).iloc[:, :3]]
[5] df2 = pandas.concat(objs, axis=1).drop('Pollutant Levels', axis=1)
[6] print(df2)
Я запускал этот код только на прошлой неделе, и он работал нормально. Но теперь мой код не работает, и я получаю эту ошибку из строки [4]:
IndexError: out-of-bounds on slice (end)
Я не внес никаких изменений в код, но теперь получаю ошибку. Я чувствую, что это из-за того, что мой метод не является надежным или правильным.
Любые предложения или рекомендации о том, как разбить этот столбец списков на отдельные столбцы, будут очень признательны!
РЕДАКТИРОВАТЬ: Я думаю, что методы .tolist () и .apply не работают на моем коде, потому что это одна строка Unicode, то есть:
#My data format
u{'a': '1', 'b': '2', 'c': '3'}
#and not
{u'a': '1', u'b': '2', u'c': '3'}
Данные импортируются из базы данных postgreSQL в этом формате. Любая помощь или идеи по этому вопросу? Есть ли способ конвертировать Unicode?
iloc[:, :3]
предполагается, что будет 3 элемента, и, возможно, более свежие срезы данных имеют только 1 или 2 (например, таких b
как в index 8813
)?
iloc