2017-02-17 4 views
2

Из этого DataFrame:инкрементный идентификатор на основе значения другого столбца

car_id month 
93829  September 
27483  April 
48372  October 
93829  December 
93829  March 
48372  February 
27483  March 

Как добавить третий столбец, который является в основном новый id для car, но инкрементный, как это:

car_id month  new_incremental_car_id 
93829  September 0 
27483  April  1 
48372  October  2 
93829  December  0 
93829  March  0 
48372  February  2 
27483  March  1 

В настоящее время я делаю это, используя groupby('car_id'), чтобы создать новый DataFrame, к которому я добавляю инкрементный столбец, который затем присоединяюсь к исходному DataFrame, используя ключ соединения car_id.

Есть ли менее громоздкий, более прямой метод для достижения этой цели?


EDIT

Код настоящее время я использую:

cars_id = pd.DataFrame(list(car_sales.groupby('car_id')['car_id'].groups)) 
cars_id['car_short_id'] = cars_id.index 
cars_id.set_index(0, inplace=True) 
car_sales.join(cars_id, on='car_id', how='left') 

ответ

1

использование factorize метод:

In [49]: df['new_incremental_car_id'] = pd.factorize(df.car_id)[0].astype(np.uint16) 

In [50]: df 
Out[50]: 
    car_id  month new_incremental_car_id 
0 93829 September      0 
1 27483  April      1 
2 48372 October      2 
3 93829 December      0 
4 93829  March      0 
5 48372 February      2 
6 27483  March      1 

In [51]: df.dtypes 
Out[51]: 
car_id      int64 
month      object 
new_incremental_car_id uint16 
dtype: object 
1

Помимо pd.factorize вы можете

Использование, map ДИКТ построены из уникальных значений.

In [959]: df.car_id.map({x: i for i, x in enumerate(df.car_id.unique())}) 
Out[959]: 
0 0 
1 1 
2 2 
3 0 
4 0 
5 2 
6 1 
Name: car_id, dtype: int64 

Или, используя category типа и codes, но не в том же порядке.

In [954]: df.car_id.astype('category').cat.codes 
Out[954]: 
0 2 
1 0 
2 1 
3 2 
4 2 
5 1 
6 0 
dtype: int8 
+0

При условии, что 'car_id' столбец уже типа' category', а затем с помощью 'car_id.cat.codes' может быть от 20 до 200 раз быстрее, чем используя 'pd.factorize' (чем больше DataFrame, тем выше скорость) – Jivan