2

次のような値を持つ列「cat100」を持つデータフレームがあります。

「A」「B」…「Y」「Z」「AA」「AB」…

AAが「B」「C」...「Z」の後にあるように、pd.factorizeを使用して列を因数分解したいと思います。

私は次のようなことを試しました:

df = pd.DataFrame(['A','B','AA'])
df[0] = pd.factorize(df[0], sort=True)[0]

しかし、これは A を 0 に、B を 2 に、AA を 1 に割り当てます。AA を 2 に、B を 1 に割り当てたいのです。

これを行う方法を検索しましたが、何も見つかりませんでした。これを行う方法はありますか?

4

1 に答える 1

3

DF次のように、文字列列を持つ を考えてみましょう。

df = pd.DataFrame(dict(col=['A','B','AA','C','BB','AAA','BC','AB','AA']))
df

ここに画像の説明を入力

カスタム機能:

(i) 検討中の列から一意のエントリを取得します。
(ii)Groupby文字列の長さによって、これらを辞書順にソートし、水平に積み重ねます。
(iii) それらを因数分解します。

def complex_factorize(df, col):
    ser = pd.Series(df[col].unique())
    func = lambda x: sorted(x.values.ravel())
    arr = np.hstack(ser.groupby(ser.str.len()).apply(func).values)
    return pd.factorize(arr)

メソッドによって返されたシリーズのラベルと一意の要素を取得し、factorizeそれをフィードしDF.replaceてマッピングを構築します。

val, ser = complex_factorize(df, 'col')
df.replace(ser, val)

ここに画像の説明を入力

于 2016-11-11T19:16:38.797 に答える