gpt4 book ai didi

python - 使用 Pandas 将一列字典拆分/分解为单独的列

转载 作者:IT老高 更新时间:2023-10-28 21:33:27 25 4
gpt4 key购买 nike

我将数据保存在 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?

最佳答案

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


使用一个小例子,可以使用.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

关于python - 使用 Pandas 将一列字典拆分/分解为单独的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38231591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com