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

Python 在Pandas中使用.map从字典创建列时,请省略大括号,python,pandas,dictionary,dataframe,Python,Pandas,Dictionary,Dataframe,我不确定我的标题是否足够清晰,但我有以下问题:我想使用.map从数据框中的字典创建一个新列。除了一个问题外,这是按预期工作的:该函数从字典中提取一个带大括号的整个字符串,而不仅仅是值。我在谷歌上搜索了很长一段时间,找不到一个能带来不同结果的教程,也找不到这个问题的答案。例如: df: 格言: 现在,我想使用.map创建一个新列,其值对应于col1,如下所示: col1 col_new 0 a 2 1 b 4 2 c 1 相反,我得到的是: c

我不确定我的标题是否足够清晰,但我有以下问题:我想使用
.map
从数据框中的字典创建一个新列。除了一个问题外,这是按预期工作的:该函数从字典中提取一个带大括号的整个字符串,而不仅仅是值。我在谷歌上搜索了很长一段时间,找不到一个能带来不同结果的教程,也找不到这个问题的答案。例如:

df:

格言:

现在,我想使用.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)
我试着用
来表示数字,但没有任何效果,我猜这与数字/字符串类型的数据没有任何关系


作为一名自学成才的数据分析师,我刚刚开始使用Python,希望您能提供任何帮助。有时,我仍然很难在文档中找到答案。

发生的事情是,您的字典值本身就是字典

因此
pd.Series.map
将只映射到字典值。它不能做任何其他事情。有一些变通办法

使用itemgetter提取值 这将提取每个字典中“value”键的值

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)

除非您打算在
.map()
之前重新构建您的
dict
,否则以下方法将适用

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

  col1  new_col
0   a   2
1   b   4
2   c   1

字典中的值设置为dataframe的列

dic = { 'a' : 2, 'b' : 4, 'c' : 1}
df["new_col"] = df.col1.map(dict)

这应该行得通。

旁注:给字典命名
dict
是个坏主意。它覆盖了内置的功能,我并没有这样称呼它,它主要是为了这个简单的例子。不过,感谢您提供的信息,我不知道,我可能在将来的某个时候会这样做。这是有意义的,所以我们可以回顾一下字典最初是如何从数据帧创建的,并首先修复此过程:
dfA.set_index(“col_abc”).t.to_dict(“dict”)
@DataWiz,当然,但是请注意,
pd.Series.map
可以直接与另一个系列一起使用。你可能根本不需要字典。关于这段代码我可以修改什么吗
dfA
有两列,第一列是
col\u abc
,用于创建字典索引,第二列是
value
,用于值。现在,这段代码将列名添加到每个值中,在字典中创建您所描述的字典。只需使用
s=dfA。设置索引('col\u abc')['value']
,然后使用
df['new\u col']=df['col1'].map(s)
  col1  new_col
0   a   2
1   b   4
2   c   1
dic = { 'a' : 2, 'b' : 4, 'c' : 1}
df["new_col"] = df.col1.map(dict)