2015-12-20 179 views
3

假設下面的數據框:熊貓據幀列值再映射

df = pd.DataFrame({'id': [8,16,23,8,23], 'count': [5,8,7,1,2]}, columns=['id', 'count']) 

    id count 
0 8  5 
1 16  8 
2 23  7 
3 8  1 
4 23  2 

...有一些熊貓的魔法,讓我重新映射的ID,以使IDS成爲順序?尋找類似的結果:

id count 
0 0  5 
1 1  8 
2 2  7 
3 0  1 
4 2  2 

在原始ID [8,16,23]被重新映射到[0,1,2]

注:重新映射不必維護IDS的原始順序。例如,以下重新映射也可以:[8,16,23] -> [2,0,1],但重新映射後的id空間應該是連續的。

我目前使用for循環和dict跟蹤重新映射,但感覺像熊貓可能有更好的解決方案。

回答

3

使用factorize

>>> df 
    id count 
0 8  5 
1 16  8 
2 23  7 
3 8  1 
4 23  2 
>>> df['id'] = pd.factorize(df['id'])[0] 
>>> df 
    id count 
0 0  5 
1 1  8 
2 2  7 
3 0  1 
4 2  2 
1

您可以通過GROUPBY的標籤,這樣做:

In [11]: df 
Out[11]: 
    id count 
0 8  5 
1 16  8 
2 23  7 
3 8  1 
4 23  2 

In [12]: g = df.groupby("id") 

In [13]: g.grouper.labels 
Out[13]: [array([0, 1, 2, 0, 2])] 

In [14]: df["id"] = g.grouper.labels[0] 

In [15]: df 
Out[15]: 
    id count 
0 0  5 
1 1  8 
2 2  7 
3 0  1 
4 2  2 
0

這可能會對你有所幫助。

x,y = pd.factorize(df['id']) 
remap = dict(set(zip(list(x),list(y))))