2017-04-13 86 views
3

我有一個鍵和值的字典。我想在數據框列中「映射」數字,其中原始列是鍵,新列是值。熊貓:映射到新列,不包括一些代碼

但是,是不包括在字典中應編碼的任何值作爲999

原始數據幀:

 Col1 
0 02 
1 03 
2 02 
3 02 
4 04 
5 88 
6 77 

詞典:

codes = {'01':'05', 
     '02':'06', 
     '03':'07', 
     '04':'08'} 

預期輸出:

>>> df['ColNew'] = df['Col1'].map(codes) 

    ColNew 
0 06 
1 07 
2 06 
3 06 
4 08 
5 999 
6 999 

我不知道如何做到這一點,除了首先在字典中包含999代碼。當有涉及百餘碼,只有少數人需要是其他任何超過999

+0

考慮到您在'codes'中提出的映射,新輸出中索引爲4的值不應該爲'08'嗎? – blacksite

+0

我修復了這個問題,對不起! – ale19

回答

2

使用mapdict.get
dict.get讓您在key不存在的事件傳遞一個默認值。

df['ColNew'] = df['Col1'].map(lambda x: codes.get(x, 999)) 

df 

    Col1 ColNew 
0 02  06 
1 03  07 
2 02  06 
3 02  06 
4 04  08 
5 88 999 
6 77 999 

這也將保留dtypes。在這種情況下,這並不重要,因爲該列的dtypeobject

但是,如果它是int,map會在NaN回來時變成float。通過使用默認值,我們可以避免類型轉換。

+0

我期待''na_action'在'map'到'fillna',但它似乎並不工作,即使有NaN – EdChum

+0

謝謝!完美的作品! – ale19

1

是令人沮喪:這是一個低劣問題的答案pi​​RSquared由於類型轉換:

之後您可以簡單地填寫NaN。

df['ColNew'] = df.Col1.map(codes).fillna('999') 

結果:

 ColNew 
0 06 
1 07 
2 06 
3 06 
4 05 
5 999 
6 999 

一個有趣的事情是,na_action參數Series.map用作默認映射的說法,因爲我本來很想去思考。

它的目的實際上是控制NaN值是否受映射函數影響 - 如果您沒有以任何方式映射它們,則會通過設置na_action='ignore'來看到潛在的性能提升。

0

只是另一種方式對皮膚此貓:

new_codes = {k: codes[k] if k in codes else '999' for k in set(df['Col1'])} 
df['ColNew'] = df['Col1'].map(new_codes) 

df 
Out[126]: 
    Col1 ColNew 
0 02  06 
1 03  07 
2 02  06 
3 02  06 
4 04  08 
5 88 999 
6 77 999 

一些計時:

%timeit df['Col1'].map({k: codes[k] if k in codes else '999' for k in set(df['Col1'])}) 
1000 loops, best of 3: 373 µs per loop 

%timeit df['Col1'].map(lambda x: codes.get(x, 999)) 
10000 loops, best of 3: 133 µs per loop 

%timeit df.Col1.map(codes).fillna('999') 
The slowest run took 92.77 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000 loops, best of 3: 575 µs per loop 

貌似piRSquared's answer比我快約64%!