2015-08-28 83 views
3

比方說,我有類別1到10,並且我想將red分配到值3到5,​​到1,6和7,blue到2,8,9和10。和10.熊貓:將多個類別合併爲一個

我該怎麼做?如果我嘗試

df.cat.rename_categories(['red','green','blue']) 

我得到一個錯誤:ValueError: new categories need to have the same number of items than the old categories!但如果我把這個

df.cat.rename_categories(['green','blue','red', 'red', 'red' 
         'green', 'green', 'blue', 'blue' 'blue']) 

我會得到一個錯誤,指出有重複的值。

我能想到的唯一的其他方法是編寫一個for循環,它將通過值的字典並替換它們。有沒有更優雅的解決這個問題?

+0

您是否只有一個要更改的系列,還是必須在整個數據框中發生? (順便說一句,'pd.cat'是'df.cat'的拼寫錯誤嗎?我們通常使用'pd'作爲熊貓的縮寫。) – DSM

+0

抱歉,這是一種類型。它應該是一個dataFrame名稱,我會解決它。但要回答你的問題,這只是一個系列/專欄。 –

回答

5

不確定優雅,但是如果你把舊到新的類別的字典,類似的信息(注意添加「紫」):

>>> m = {"red": [3,4,5], "green": [1,6,7], "blue": [2,8,9,10], "purple": [11]} 
>>> m2 = {v: k for k,vv in m.items() for v in vv} 
>>> m2 
{1: 'green', 2: 'blue', 3: 'red', 4: 'red', 5: 'red', 6: 'green', 
7: 'green', 8: 'blue', 9: 'blue', 10: 'blue', 11: 'purple'} 

你可以用它來建立一個新的分類系列:

>>> df.cat.map(m2).astype("category", categories=set(m2.values())) 
0 green 
1  blue 
2  red 
3  red 
4  red 
5 green 
6 green 
7  blue 
8  blue 
9  blue 
Name: cat, dtype: category 
Categories (4, object): [green, purple, red, blue] 

(如果你關心的分類排序或有序的等價物),您不需要categories=set(m2.values())如果你確信所有分類值將在該列中可以看出。但是在這裏,如果我們沒有這樣做,我們就不會在結果分類中看到purple,因爲它是從它實際看到的類別構建而成的。

當然,如果你已經建立了你的清單['green','blue','red', etc.],直接使用它直接創建一個新的分類列並完全繞過這個映射也是一樣簡單。

+0

謝謝,這個作品! –

+0

我們應該將'k'解釋爲'new_name','v'爲'old_name','vv'爲'old_names',是否正確? – Chill2Macht

+0

看起來(如果我錯了,請糾正我)上面給出的'.astype()'的第二個參數在沒有被包含在set()中時不起作用(不管我們是否添加了'purple' ),因爲那樣我們會得到'類別必須是唯一的'錯誤(即因爲沒有首先將'm2.values()'傳遞給'set()'),'m2.values()'的元素不是唯一的。至少我得到了那個錯誤。只是傳遞'categorical'作爲唯一的參數可以很好地提供所需的結果 - 現在加上一個警告現在傳遞給'.type()'的'categories'參數現在已被棄用。 – Chill2Macht