나는 열이있는 dataframe을 가지고 가정 a
, b
그리고 c
, 나는 열을 기준으로 dataframe을 정렬 할 b
순서를 오름차순으로하고, 열을 기준으로 c
내림차순으로, 어떻게해야합니까?
답변
0.17.0 릴리스부터는이 sort
방법이 더 이상 사용되지 않습니다 sort_values
. sort
0.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'
됩니다.