Z tego dataframe:

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

Jak dodać trzecią kolumnę, która jest zasadniczo nowym id dla car, ale przyrostowa, podobna do tego:

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

Obecnie robię to za pomocą groupby('car_id'), aby utworzyć nową dataframe, do której dodam przyrostową kolumnę, która następnie dołączyć do oryginalnego Dataframe za pomocą klawisza {x1}}.

Czy istnieje mniej kłopotliwy, bardziej bezpośrednia metoda, aby osiągnąć ten cel?


EDYTUJ

Kodeks, którego obecnie używam:

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')
2
Jivan 17 luty 2017, 13:30

2 odpowiedzi

Najlepsza odpowiedź

Użyj Metoda factize:

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
MaxU 17 luty 2017, 10:49

Oprócz pd.factorize możesz

Użyj, map DICT skonstruowany z unikalnych wartości.

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

Lub przy użyciu typu category i codes, ale nie w tej samej kolejności.

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
1
Zero 17 luty 2017, 14:22