파이썬 팬더에서 dataFrame을 두 개 이상의 열로 정렬하는 방법은 무엇입니까?


답변:


454

0.17.0 릴리스부터는이 sort방법이 더 이상 사용되지 않습니다 sort_values. sort0.20.0 릴리스에서 완전히 제거되었습니다. 인수와 결과는 동일하게 유지됩니다.

df.sort_values(['a', 'b'], ascending=[True, False])

다음의 오름차순 인수를 사용할 수 있습니다 sort.

df.sort(['a', 'b'], ascending=[True, False])

예를 들면 다음과 같습니다.

In [11]: df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])

In [12]: df1.sort(['a', 'b'], ascending=[True, False])
Out[12]:
   a  b
2  1  4
7  1  3
1  1  2
3  1  2
4  3  2
6  4  4
0  4  3
9  4  3
5  4  1
8  4  1

@renadeen의 코멘트

정렬은 기본적으로 제자리에 없습니다! 따라서 정렬 메소드의 결과를 변수에 지정하거나 inplace = True를 메소드 호출에 추가해야합니다.

즉, df1을 정렬 된 DataFrame으로 재사용하려는 경우 :

df1 = df1.sort(['a', 'b'], ascending=[True, False])

또는

df1.sort(['a', 'b'], ascending=[True, False], inplace=True)

6
정렬은 기본적으로 제자리에 없습니다! 따라서 결과는sort 메소드 변수에 지정하거나 inplace=True메소드 호출에 추가 해야합니다.
renadeen

2
@renadeen 아주 좋은 지적, 나는 그 의견에 대한 답변으로 업데이트했습니다.
Andy Hayden

1
나는 그 종류가 더 이상 사용되지 않는다는 것을 오늘 알게되어 놀랐습니다! 이 메타 포스트의 일부 의견을 바탕으로 : meta.stackoverflow.com/questions/297404/… 나는 새로운 답을 추가하기보다는 당신에 대한 편집을 시도하기로 결정
카일 Heuton

2
@Snoozer 그래, 나는 정렬이 사라질 것이라고 생각하지 않지만 (주로 Wes의 책에서 광범위하게 사용됨) 정렬 정렬에 큰 변화 가있었습니다 . 감사! .. 지원 중단에 대한 1000 개의 팬더 답변을 모두 자동으로 처리해야합니다.
Andy Hayden

40

팬더 0.17.0부터는 DataFrame.sort()더 이상 사용되지 않으며 향후 판다 버전에서 제거되도록 설정되었습니다. 값을 기준으로 데이터 프레임을 정렬하는 방법은 다음과 같습니다.DataFrame.sort_values

따라서 귀하의 질문에 대한 답변은 이제

df.sort_values(['b', 'c'], ascending=[True, False], inplace=True)

4

숫자 데이터의 큰 데이터 프레임의 경우을 통해 성능이 크게 향상 numpy.lexsort되어 일련의 키를 사용하여 간접 정렬을 수행 할 수 있습니다 .

import pandas as pd
import numpy as np

np.random.seed(0)

df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])
df1 = pd.concat([df1]*100000)

def pdsort(df1):
    return df1.sort_values(['a', 'b'], ascending=[True, False])

def lex(df1):
    arr = df1.values
    return pd.DataFrame(arr[np.lexsort((-arr[:, 1], arr[:, 0]))])

assert (pdsort(df1).values == lex(df1).values).all()

%timeit pdsort(df1)  # 193 ms per loop
%timeit lex(df1)     # 143 ms per loop

한 가지 특이점은 정의 된 정렬 순서 numpy.lexsort가 반대라는 것입니다. 먼저 (-'b', 'a')시리즈별로 정렬합니다 a. 우리는 b이 시리즈를 내림차순으로 반영하기 위해 시리즈 를 부정 합니다.

그주의 np.lexsort만 숫자 값으로 정렬하는 동안 pd.DataFrame.sort_values두 문자열이나 숫자 값으로 작동합니다. np.lexsort문자열과 함께 사용하면 다음 이 제공 TypeError: bad operand type for unary -: 'str'됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.