2013-05-09 4 views
9

팬더 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] 

가에 순차적 인덱스를 할당 각각을 계산하고 데이터 프레임의 각 행이 속하는 색인을 계산합니다.

Factorize은 단일 열에서만 작동합니다. 팬더에 멀티 컬럼 동등한 기능이 있습니까?

+0

예상되는 출력은 무엇입니까? – waitingkuo

+0

코멘트의 목록 - 각각의 고유 한 (x, y) 값에 대한 순차적 인 인덱스 – ChrisB

답변

11

당신은 ndarray를 생성해야합니다. f 튜플 먼저, 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 한 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])) 

그래서 편곡을 인쇄하는 인덱스를 유지하는 당신에게

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

을 줄 것이다, 나는 산업사 배열

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

인쇄 공업 줄 것입니다 선언합니다

>>>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 –