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)