用熊猫将一列字典拆分/分解成单独的列

新手上路,请多包涵

我将数据保存在 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 许可协议

阅读 332
1 个回答

要将字符串转换为实际的字典,您可以执行 df['Pollutant Levels'].map(eval) 。之后,可以使用下面的解决方案将字典转换为不同的列。


使用一个小示例,您可以使用 .apply(pd.Series)

 In [2]: df = pd.DataFrame({'a':[1,2,3], 'b':[{'c':1}, {'d':3}, {'c':5, 'd':6}]})

In [3]: df
Out[3]:
   a                   b
0  1           {u'c': 1}
1  2           {u'd': 3}
2  3  {u'c': 5, u'd': 6}

In [4]: df['b'].apply(pd.Series)
Out[4]:
     c    d
0  1.0  NaN
1  NaN  3.0
2  5.0  6.0

要将它与数据框的其余部分结合起来,您可以 concat 具有上述结果的其他列:

 In [7]: pd.concat([df.drop(['b'], axis=1), df['b'].apply(pd.Series)], axis=1)
Out[7]:
   a    c    d
0  1  1.0  NaN
1  2  NaN  3.0
2  3  5.0  6.0


使用您的代码,如果我省略 iloc 部分,这也有效:

 In [15]: pd.concat([df.drop('b', axis=1), pd.DataFrame(df['b'].tolist())], axis=1)
Out[15]:
   a    c    d
0  1  1.0  NaN
1  2  NaN  3.0
2  3  5.0  6.0

原文由 joris 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题