2016-12-13 1 views
-1

각 행의 값을 정렬하고 값을 열 이름으로 바꿔야합니다. 아래 데이터 프레임이 있다고 가정합니다.pandas 데이터 프레임에서 행 값을 정렬하고 열 이름으로 바꾸는 방법

ID A B C 
1 8 10 9 
2 6 7 8 
3 13 14 7 

이 양식으로 변환하고 싶습니다.

1 B C A 
2 c B A 
3 B A C 

파이썬으로 변환하는 방법이 있습니까?

내가 이런 식으로 생각하고있다 :

df.sort(0, ascending=False) 

을하지만 나를 위해 작동하지 않습니다.

+2

(210)는 당신의 노력 내가 뭘 복잡하고 내가 물었다 즉 알고 –

+0

을 제시해주십시오. 그것을 할 수있는 함수가 있다면, 다음과 같은 함수가 없을 경우를 대비하여 함수를 개발할 것입니다. 따라서 downvoting 대신에 조언하십시오. 감사. –

+0

@NatheerMohammedAbdulwaheed - 내 대답이 도움이 되었다면 [수락] (http://meta.stackexchange.com/a/5235/295067)을 잊지 마세요. 감사. – jezrael

답변

1

아이디어는 각 행을 정렬하고 결과 색인을 가져 오는 것입니다.

df.apply(lambda row: row.sort_values(ascending=False).index, axis=1) 

행 단위로 적용 할 때 각 행의 인덱스는 데이터 프레임의 열입니다.

4

당신은 numpy.argsort를 사용하지만, 첫 set_index에 의해 index에 열 ID를 얻을 수 있습니다 :

df = df.set_index('ID') 

print ((np.argsort(-df.values, axis=1))) 
[[1 2 0] 
[2 1 0] 
[1 0 2]] 

print (df.columns[np.argsort(-df.values, axis=1)]) 
Index([['B', 'C', 'A'], ['C', 'B', 'A'], ['B', 'A', 'C']], dtype='object') 

print (pd.DataFrame(df.columns[np.argsort(-df.values, axis=1)], 
           index=df.index)) 

    0 1 2 
ID   
1 B C A 
2 C B A 
3 B A C  

print (pd.DataFrame(df.columns[np.argsort(-df.values, axis=1)], 
           index=df.index).reset_index()) 

    ID 0 1 2 
0 1 B C A 
1 2 C B A 
2 3 B A C 

를 필요가 원래 DataFrame에서 열 설정 한 경우 :

print (pd.DataFrame(df.columns[np.argsort(-df.values, axis=1)], 
           index=df.index, 
           columns=df.columns)) 

    A B C 
ID   
1 B C A 
2 C B A 
3 B A C   

타이밍 :

#[3 rows x 3 columns] 

In [97]: %timeit (pd.DataFrame(df.columns[np.argsort(-df.values, axis=1)],index=df.index, columns=df.columns)) 
10000 loops, best of 3: 126 µs per loop 

In [98]: %timeit (df.apply(lambda row: row.sort_values(ascending=False).index, axis=1)) 
1000 loops, best of 3: 1.95 ms per loop 
,691,363을
#[30000 rows x 3 columns] 
df = pd.concat([df]*10000).reset_index(drop=True)  
#print (df) 

df = df.set_index('ID') 

In [103]: %timeit (pd.DataFrame(df.columns[np.argsort(-df.values, axis=1)],index=df.index, columns=df.columns)) 
1000 loops, best of 3: 1.76 ms per loop 

In [104]: %timeit (df.apply(lambda row: row.sort_values(ascending=False).index, axis=1)) 
1 loop, best of 3: 7.21 s per loop    
관련 문제