2

識別子列を持つDataFrameにいくつかのデータがあります。

data = DataFrame({'id' : [50,50,30,10,50,50,30]})

一意のIDごとに、新しい一意の識別子を考え出します。IDを0から始まる連続した整数にしたいのですが、これまでのところ次のようになっています。

unique = data[['id']].drop_duplicates()   
unique['group'] = np.arange(len(unique))
unique.set_index('id')
data = data.merge(unique, 'inner', on = 'id')

これは機能しますが、少し汚れているようです。もっと良い方法はありますか?

4

1 に答える 1

8

それは何をするかpandas.factorizeです:

data = pd.DataFrame({'id' : [50,50,30,10,50,50,30]})
print pd.factorize(data.id)[0]

出力:

[0 0 1 2 0 0 1]

numpy.uniqueこれもできます:

import numpy as np
print np.unique([50,50,30,10,50,50,30], return_inverse=True)[1]

出力:

array([2, 2, 1, 0, 2, 2, 1])

によって出力されるインデックスnumpy.uniqueは値でソートされるため、最小値10はインデックス0に割り当てられます。を使用してこの結果が必要な場合は、引数を:factorizeに設定します。sortTrue

pandas.factorize(data.id, sort=True)[0]
于 2013-03-13T03:24:22.430 に答える