2

次の状況は、私のデータ分析からしばしば発生します。いくつかの観測から、データの2つのベクトルxとyがあるとします。xにはより多くのデータポイントがあるため、yでは観察されない値がいくつか含まれています。次に、それらをカテゴリ変数にします。

x=['a','b','c','d','e']  #data points
y =['a','c','e']         #data of the same nature as x but with fewer data points  

fx = pandas.Categorical.from_array(x)
fy = pandas.Categorical.from_array(y)

print fx.index
print fy.index

Categorical: 
array([a, b, c, d, e], dtype=object)
Levels (5): Index([a, b, c, d, e], dtype=object) Categorical: 
array([a, c, e], dtype=object)
Levels (3): Index([a, c, e], dtype=object)

レベルが異なり、ラベルの意味も異なることがわかります(1はfxではbを意味しますが、fyではcを意味します)。

これにより、fx.labelsとfy.labelsが同じエンコーディング/意味を持つことを期待しているため、fxとfyの両方で動作するコードが明らかに困難になります。

fx.lablesしかし、fxとfyを「正規化」して、それらが同じレベルになりfy.lables、同じコーディングになるようにする方法がわかりません。fy.labels = fx.lables明らかに機能しません。以下は、ラベルの意味が変わることを示しているように、[ace]は[abc]になります。

fy.levels = fx.levels
print fy

Categorical: 
array([a, b, c], dtype=object)
Levels (5): Index([a, b, c, d, e], dtype=object)

誰かアイデアはありますか?

別の関連するシナリオは、既存の既知のインデックスがあり、データをこのインデックスに因数分解したいというものです。たとえば、すべてのデータポイントが5つの値[a、b、c、d、e]のいずれかを取る必要があることを知っています。すでにインデックスがあり、Index([a, b, c, d, e], dtype=object)ベクトルy = ['a'、'c'を因数分解したいと思います。 、'e']をレベルとしてのカテゴリ変数に変換しIndex([a, b, c, d, e], dtype=object)ます。どうすればいいのかわからないので、知っている人に手がかりを教えてもらいたい。

PS Rでそのようなことをすることは可能ですが、面倒です。

ありがとう、トム

4

3 に答える 3

4

get_indexer()メソッドを使用して、インデックス配列を作成できます。

x=['a','b','c','d','e']  #data points
y =['a','c','e']         #data of the same nature as x but with fewer data points  
idx = pd.Index(pd.unique(x+y))
cx = pd.Categorical(idx.get_indexer(x), idx)
cy = pd.Categorical(idx.get_indexer(y), idx)
于 2013-03-12T12:40:21.587 に答える
4
In [6]: fxd = {fx.levels[i]: i for i in range(len(fx.levels))}

In [7]: fy.labels = [fxd[v] for v in fy]

In [8]: fy.levels = fx.levels

In [9]: fy
Out[9]: 
Categorical: 
array([a, c, e], dtype=object)
Levels (5): Index([a, b, c, d, e], dtype=object)
于 2012-12-20T19:28:22.027 に答える