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

나는 열이있는 dataframe을 가지고 가정 a, b그리고 c, 나는 열을 기준으로 dataframe을 정렬 할 b순서를 오름차순으로하고, 열을 기준으로 c내림차순으로, 어떻게해야합니까?



답변

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)


답변

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

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

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


답변

숫자 데이터의 큰 데이터 프레임의 경우을 통해 성능이 크게 향상 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'됩니다.


답변