我有数据存储在一个postgreSQL
数据库中。我正在使用Python2.7查询这些数据,并将其转换为Pandas DataFrame。然而,这个数据框的最后一列里面有一组值的字典。DataFrame 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 `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'。并且它们总是按照相同的顺序出现(首先是'a',其次是'b',第三个是'c')。
下面的代码曾经可以工作并返回我想要的确切结果(df2)。
objs = [df, pandas.DataFrame(df['Pollutant Levels'].tolist()).iloc[:, :3]]
df2 = pandas.concat(objs, axis=1).drop('Pollutant Levels', axis=1)
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?
df[col].map(eval)
将其转换为实际的字典。 - joris.map(eval)
是否存在安全风险? - Robert Muilliteral_eval
(https://docs.python.org/3/library/ast.html#ast.literal_eval)来限制解析。 - jorisapply(pd.Series)
太慢了! - CutePoison