2015-12-20 2 views
3

Предполагая следующую DataFrame:Панда DataFrame значения столбца переназначение

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 count 
0 0  5 
1 1  8 
2 2  7 
3 0  1 
4 2  2 

где были переназначены оригинальные идентификаторы [8,16,23] в [0,1,2]

Примечание: переназначение не должен поддерживать первоначальный порядок идентификаторов. Например, следующее переназначение также будет прекрасным: [8,16,23] -> [2,0,1], но пространство пробела после переназначения должно быть смежным.

В настоящее время я использую цикл for и dict, чтобы отслеживать переназначение, но похоже, что у Pandas может быть лучшее решение.

ответ

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)))) 
Смежные вопросы