2017-02-17 52 views
2

從這個數據幀:增量ID

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

如何添加第三列,其基本上是carid,而是一種遞增的,就像這樣:

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,我在其中添加一個增量列,然後使用car_id連接密鑰連接回原始DataFrame。

是否有一個不太麻煩,更直接的方法來實現這一目標?


編輯

我目前使用的代碼:

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