当前位置: 首页 > 面试题库 >

Python-将pandas列中的字典/列表拆分为单独的列

冯枫
2023-03-14
问题内容

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


问题答案:

要将字符串转换为实际的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


 类似资料:
  • II有一个serie对象包含3列(名称,代码,值),我从下面的函数得到: 意甲看起来像这样 我可以用下面的代码将输出分配给我的数据帧。 我得到的数据框是这样的 如何将此列拆分为3列?

  • 如何将这列列表拆分为两列? 期望的结果:

  • 问题内容: 我有这样的词典列表: 我想把它变成这样的大熊猫: 注意:列的顺序无关紧要。 如何将字典列表转换为如上所述的? 问题答案: 假设d你的字典列表很简单:

  • 问题内容: 我有一列如下所示的熊猫: 我需要将列表的此列分为2列,并使用。 问题答案: 您可以使用与构造函数通过转换为创建通过使用: 对于新的DataFrame: 解决方案apply(pd.Series)非常慢:

  • 问题内容: 我有一个如下所示的Pandas数据框: 我正在尝试将列表分成几列,如下所示: 没有值的列(因为列表没有那么长)用空白或NaN或其他内容填充。 我见过类似的回答这一个和其他类似的给它,而他们在长度相等的名单工作,他们都扔错误,当我尝试使用的长度不等的列表中的方法。有什么好办法吗? 问题答案: 尝试: 包括 我们可以通过以下方式确定所有格式:

  • 问题内容: 我有一些数据,其中包括带有定界数据的列。本质上,同一列中有多个记录: 这些值的长度可变,并以句点分隔。我一直在尝试使用游标为此数据创建一个查找表。由于数据量大,光标过慢。 我的光标如下所示: 当前版本的光标仅适用于列的前导值。所有长度都是任意的。该列的最大长度为〜150个字符。 使用当前数据集,构建查找表可能需要几天的时间。它将有几百万条记录。 是否有更好的方法可以有效(快速)将这些数