2014-06-14 42 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