2013-05-09 11 views
9

pandas factorize関数は、系列内の各固有値を順次0ベースのインデックスに割り当て、各系列エントリがどのインデックスに属するかを計算します。パンダの複数列因子分解

私は複数の列にpandas.factorizeと同等のものを達成したいと思います:

import pandas as pd 
df = pd.DataFrame({'x': [1, 1, 2, 2, 1, 1], 'y':[1, 2, 2, 2, 2, 1]}) 
pd.factorize(df)[0] # would like [0, 1, 2, 2, 1, 0] 

、私は、データフレームのいくつかの列の値の一意の各タプルを決定したい、にシーケンシャルインデックスを割り当てていることeach、およびデータフレーム内の各行がどのインデックスに属するかを計算します。

Factorizeは、単一の列でのみ機能します。パンダに複数の列に相当する機能がありますか?

+0

あなたの予想出力は何ですか? – waitingkuo

+0

コメント内のリスト - 別個の(x、y)値ごとに一意の連続したインデックス – ChrisB

答えて

11

あなたはndarrayを作成する必要があります最初に、pandas.lib.fast_zipはこれを非常に速くcythonループで行うことができます。

import pandas as pd 
df = pd.DataFrame({'x': [1, 1, 2, 2, 1, 1], 'y':[1, 2, 2, 2, 2, 1]}) 
print pd.factorize(pd.lib.fast_zip([df.x, df.y]))[0] 

出力は次のようになります。

[0 1 2 2 1 0] 
+0

ありがとうございます - それは私が探している答えを合理的にコンパクトな形で与えます – ChrisB

0

あなたはあなたの目標を達成するには、[編集]

In [23]: df.drop_duplicates() 
Out[23]: 
     x y 
    0 1 1 
    1 1 2 
    2 2 2 

それらの重複行を削除するにはdrop_duplicatesを使用することができ、あなたがdrop_duplicated 1にあなたの元DFに参加することができます。

In [46]: df.join(df.drop_duplicates().reset_index().set_index(['x', 'y']), on=['x', 'y']) 
Out[46]: 
    x y index 
0 1 1  0 
1 1 2  1 
2 2 2  2 
3 2 2  2 
4 1 2  1 
5 1 1  0 

+0

私はそれらを削除するつもりはありませんが、別個の値の各ペアに一意のインデックスを割り当てます。値が[0,1,2,2,1,0]のデータフレームに新しい列を追加します。 – ChrisB

+0

私は自分の答えを更新しました。あなたの問題に今対応していますか? – waitingkuo

1

私はこれが効率的な解決策であるかどうかは不明です。これにはもっと良い解決策があるかもしれません。

arr=[] #this will hold the unique items of the dataframe 
for i in df.index: 
    if list(df.iloc[i]) not in arr: 
     arr.append(list(df.iloc[i])) 

ので、ARRを印刷するインデックスを保持するためにあなたに

>>>print arr 
[[1,1],[1,2],[2,2]] 

を与えるだろう、私はIND配列が

ind=[] 
for i in df.index: 
    ind.append(arr.index(list(df.iloc[i]))) 

印刷INDを与えるだろう宣言し

>>>print ind 
[0,1,2,2,1,0] 
0
df = pd.DataFrame({'x': [1, 1, 2, 2, 1, 1], 'y':[1, 2, 2, 2, 2, 1]}) 
tuples = df[['x', 'y']].apply(tuple, axis=1) 
df['newID'] = pd.factorize(tuples)[0] 
+1

コードを説明してください –

+0

あなたのコードがOPとはどのように違うのか、それがどのように問題を解決するのかを説明してください。便利な回答を作成する際にこのガイドをお勧めします。https://stackoverflow.com/help/how-to-answer –

関連する問題