2017-04-07 1 views
3

데이터 프레임이 있고 모든 열을 내림차순 또는 오름차순으로 독립적으로 정렬하려고합니다.sort_values ​​()를 사용하여 pandas DataFrame의 모든 열을 개별적으로 정렬

import pandas as pd 

data = {'a': [5, 2, 3, 6], 
     'b': [7, 9, 1, 4], 
     'c': [1, 5, 4, 2]} 
df = pd.DataFrame.from_dict(data) 
    a b c 
0 5 7 1 
1 2 9 5 
2 3 1 4 
3 6 4 2 

나는 이것에 대한 sort_values()를 사용하는 경우는 (나에게) 예상대로 작동 단 하나의 열 정렬하지 않습니다 내가 this 대답에서 솔루션을 사용하는 경우

foo = df.sort_values(by=['a', 'b', 'c'], ascending=[False, False, False]) 
    a b c 
3 6 4 2 
0 5 7 1 
2 3 1 4 
1 2 9 5 

내가 원하는 결과를 얻을 수 있습니다

bar = df.apply(lambda x: x.sort_values().values) 
print(bar) 

    a b c 
0 2 1 1 
1 3 4 2 
2 5 7 4 
3 6 9 5 

그러나 이것은 나에게 무거워 보입니다.

실제로 위의 sort_values() 예제에서 무슨 일이 일어나고 있으며 람다 함수없이 팬더 방식으로 데이터 프레임의 모든 열을 정렬 할 수 있습니까?

답변

5

당신은 DataFrame 생성자 numpy.sort를 사용할 수 있습니다

df1 = pd.DataFrame(np.sort(df.values, axis=0), index=df.index, columns=df.columns) 
print (df1) 
    a b c 
0 2 1 1 
1 3 4 2 
2 5 7 4 
3 6 9 5 

편집 : 열이 통과 주문에 의해

arr = df.values 
arr.sort(axis=0) 
arr = arr[::-1] 
print (arr) 
[[6 9 5] 
[5 7 4] 
[3 4 2] 
[2 1 1]] 

df1 = pd.DataFrame(arr, index=df.index, columns=df.columns) 
print (df1) 
    a b c 
0 6 9 5 
1 5 7 4 
2 3 4 2 
3 2 1 1 
+0

감사합니다. 하지만 더 짧고 numpy 가져 오기가 필요 없기 때문에 여전히'df.apply (lambda x : x.sort_values ​​(). values)'를 선호합니다. –

+0

이것에 대한 표준 판다 구조가 없습니까? ;) –

+5

@CordKaldemeyer 'numpy'가져 오기를 피하기 위해 팬더를 사용할 때'numpy'를 피하기 위해서는 우선 순위가 없어야합니다. 왜냐하면 유장이 당신이 이미 수입 한'팬더 '를 수입하기 때문입니다. 실제로 'pandas' 네임 스페이스를 사용하면 jeszrael가 한 일을 정확하게 수행 할 수 있습니다. 'pd.DataFrame (pd.np.sort (df.values, axis = 0), index = df.index, columns = df.columns)' – piRSquared

4

sort_values 전체 데이터 프레임을 정렬합니다 : 내림차순으로

대답 그것에. 첫 번째 예에서는 ['a', 'b', 'c']으로 전체 데이터 프레임을 정렬합니다. 먼저 'a'으로 정렬 한 다음 'b'으로 만들고 마지막으로 'c'으로 정렬합니다.

a로 정렬 한 후 행이 동일하게 유지됩니다. 이것은 예상 된 결과입니다.

lambda을 사용하면 sort_values이 단일 열에 적용되므로이 두 번째 방법은 예상대로 열을 정렬하는 이유입니다. 이 경우 행이 변경됩니다.

당신이 lambda을 사용하지 않으려는도 numpy이를 사용하여 주위를 얻을 수있는 경우 :

pd.DataFrame({x: df[x].sort_values().values for x in df.columns.values}) 

출력은 : 귀하의 답변에 대한

a b c 
0 2 1 1 
1 3 4 2 
2 5 7 4 
3 6 9 5 
+0

설명해 주셔서 감사합니다! 그래서 SQL에서와 같이 작동합니다. –

+0

@CordKaldemeyer는'lambda' 나'numpy'를 사용하지 않고'df'를 정렬하는 새로운 방법으로 편집했습니다. –

+0

귀하의 도움과 설명에 감사드립니다! –

관련 문제