在Pandas中使用.map从字典创建列时,省略大括号

时间:2018-06-07 15:40:58

标签: python pandas dictionary dataframe

我不确定我的标题是否足够清晰,但我有以下问题:我想使用.map从我的数据框中的字典创建新列。这是按预期工作的,除了一个问题:该函数从字典中提取带有花括号的整个字符串,而不仅仅是值。我广泛搜索,无法找到导致不同结果或问题答案的教程。例如:

DF:

  col1
0  a
1  b
2  c

字典:

{ a : {'value' : 2},
  b : {'value' : 4},
  c : {'value' : 1}}

现在我想使用.map创建一个新列,其值与col1相对应,如下所示:

  col1  col_new
0  a       2
1  b       4
2  c       1

相反,我得到的是:

  col1     col_new
0  a    {'value' : 2}
1  b    {'value' : 4}
2  c    {'value' : 1}

这是我使用的.map命令:

df["new_col"] = df.col1.map(dict)

我尝试使用to_numeric,但这没有任何效果,我猜它与数字/字符串类型的数据没有任何关系。

任何帮助都会受到赞赏,作为一名刚开始使用Python的自学成才的数据分析师,我仍然无法在文档中找到答案。

3 个答案:

答案 0 :(得分:2)

除非您打算在dict之前重建.map(),否则以下方法适合。

df['new_col'] = df['col1'].apply(lambda x: dict_[x]['value'])

输出:

  col1  new_col
0   a   2
1   b   4
2   c   1

答案 1 :(得分:1)

你的字典值本身就是字典。

因此pd.Series.map只会映射到字典值。它无法做任何其他事情。有一些解决方法。

使用itemgetter提取值

这将提取"值"的值。每个词典中的关键词。

from operator import itemgetter

df['new_col'] = df['col1'].map(d).apply(itemgetter('value'))

在映射

之前重构字典

在映射系列之前,使用键映射构建一个新词典。

d = {k: v['value'] for k, v in d.items()}
df['new_col'] = df['col1'].map(d)

答案 2 :(得分:0)

字典中的值设置为dataframe

User   Time
a      2016-05-02 03:45:11 
b      2016-05-05 04:05:24 
b      2016-06-05 07:23:16 
c      2016-05-08 08:37:37 
d      2016-05-09 11:28:15 
c      2016-08-11 23:41:18 
c      2016-05-11 03:51:14 
b      2016-05-11 06:16:21 
b      2016-07-15 20:23:35 
a      2016-05-16 06:42:53 
a      2016-05-17 08:52:24 
a      2016-05-18 09:35:47 
a      2016-05-19 03:24:39 
d      2016-07-12 06:39:26 
.      .
.      .
.      .

这应该可以正常工作。