2014-06-14 40 views
36

我想要做一些在熊猫中应该非常简单的东西,但它似乎什么都不是。我正在尝试将列添加到基于另一个(现有)列的映射值的现有熊猫数据框中。这里是一个小的测试案例:用字典中的映射值添加一个新的熊猫列

import pandas as pd 
equiv = {7001:1, 8001:2, 9001:3} 
df = pd.DataFrame({"A": [7001, 8001, 9001]}) 
df["B"] = equiv(df["A"]) 
print(df) 

我希望下面的会导致:

 A B 
0 7001 1 
1 8001 2 
2 9001 3 

相反,我得到一个错误,告诉我,当量是不是调用函数。公平的,这是一本字典,但即使我把它包装在一个函数中,我仍然感到沮丧。于是,我就用这似乎与其他业务工作的一个地图功能,但它也通过使用字典的战败:

df["B"] = df["A"].map(lambda x:equiv[x]) 

在这种情况下,我刚刚得到KeyError异常:8001我已经通过阅读文档和以前的帖子,但还没有遇到任何建议如何混合字典与熊猫数据框。任何建议将不胜感激。

回答

57

正确的做法是df["B"] = df["A"].map(equiv)

In [55]: 

import pandas as pd 
equiv = {7001:1, 8001:2, 9001:3} 
df = pd.DataFrame({"A": [7001, 8001, 9001]}) 
df["B"] = df["A"].map(equiv) 
print(df) 
     A B 
0 7001 1 
1 8001 2 
2 9001 3 

[3 rows x 2 columns] 

它会处理这种情况时,该键不存在非常漂亮,考虑下面的例子:

In [56]: 

import pandas as pd 
equiv = {7001:1, 8001:2, 9001:3} 
df = pd.DataFrame({"A": [7001, 8001, 9001, 10000]}) 
df["B"] = df["A"].map(equiv) 
print(df) 
     A B 
0 7001 1 
1 8001 2 
2 9001 3 
3 10000 NaN 

[4 rows x 2 columns] 
+1

有没有办法做到这一点,如果你的数据是字符串,而不是中断?这只是给我一些字符串的NaNs。 – griffinc

+0

没关系,请参阅这里的答案http://stackoverflow.com/questions/20250771/remap-values-in-pandas-column-with-a-dict – griffinc