我将数据保存在 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?
原文由 llaffin 发布,翻译遵循 CC BY-SA 4.0 许可协议
要将字符串转换为实际的字典,您可以执行
df['Pollutant Levels'].map(eval)
。之后,可以使用下面的解决方案将字典转换为不同的列。使用一个小示例,您可以使用
.apply(pd.Series)
:要将它与数据框的其余部分结合起来,您可以
concat
具有上述结果的其他列:使用您的代码,如果我省略
iloc
部分,这也有效: