팬더는 그룹 집계 및 열별로 정렬
다음 데이터 프레임이 주어지면
In [31]: rand = np.random.RandomState(1)
df = pd.DataFrame({'A': ['foo', 'bar', 'baz'] * 2,
'B': rand.randn(6),
'C': rand.rand(6) > .5})
In [32]: df
Out[32]: A B C
0 foo 1.624345 False
1 bar -0.611756 True
2 baz -0.528172 False
3 foo -1.072969 True
4 bar 0.865408 False
5 baz -2.301539 True
A
의 집계 합계를 기준으로 그룹 ( ) 으로 정렬 B
한 다음 C
(집계되지 않음) 의 값 으로 정렬하고 싶습니다 . 그래서 기본적으로 A
그룹 의 순서 를
In [28]: df.groupby('A').sum().sort('B')
Out[28]: B C
A
baz -2.829710 1
bar 0.253651 1
foo 0.551377 1
그리고 True / False에 의해 궁극적으로 다음과 같이 보입니다.
In [30]: df.ix[[5, 2, 1, 4, 3, 0]]
Out[30]: A B C
5 baz -2.301539 True
2 baz -0.528172 False
1 bar -0.611756 True
4 bar 0.865408 False
3 foo -1.072969 True
0 foo 1.624345 False
어떻게 할 수 있습니까?
Groupby A :
In [0]: grp = df.groupby('A')
각 그룹 내에서 B를 합산하고 변환을 사용하여 값을 브로드 캐스트합니다. 그런 다음 B를 기준으로 정렬합니다.
In [1]: grp[['B']].transform(sum).sort('B')
Out[1]:
B
2 -2.829710
5 -2.829710
1 0.253651
4 0.253651
0 0.551377
3 0.551377
위에서 색인을 전달하여 원본 df를 색인화합니다. 이렇게하면 B 값의 총합에 따라 A 값이 다시 정렬됩니다.
In [2]: sort1 = df.ix[grp[['B']].transform(sum).sort('B').index]
In [3]: sort1
Out[3]:
A B C
2 baz -0.528172 False
5 baz -2.301539 True
1 bar -0.611756 True
4 bar 0.865408 False
0 foo 1.624345 False
3 foo -1.072969 True
마지막으로 sort=False
1 단계의 A 정렬 순서를 유지하는 옵션을 사용하여 'A'그룹 내에서 'C'값을 정렬합니다 .
In [4]: f = lambda x: x.sort('C', ascending=False)
In [5]: sort2 = sort1.groupby('A', sort=False).apply(f)
In [6]: sort2
Out[6]:
A B C
A
baz 5 baz -2.301539 True
2 baz -0.528172 False
bar 1 bar -0.611756 True
4 bar 0.865408 False
foo 3 foo -1.072969 True
0 foo 1.624345 False
reset_index
with 를 사용하여 df 인덱스를 정리하십시오 drop=True
.
In [7]: sort2.reset_index(0, drop=True)
Out[7]:
A B C
5 baz -2.301539 True
2 baz -0.528172 False
1 bar -0.611756 True
4 bar 0.865408 False
3 foo -1.072969 True
0 foo 1.624345 False
더 간결한 접근 방식이 있습니다 ...
df['a_bsum'] = df.groupby('A')['B'].transform(sum)
df.sort(['a_bsum','C'], ascending=[True, False]).drop('a_bsum', axis=1)
The first line adds a column to the data frame with the groupwise sum. The second line performs the sort and then removes the extra column.
Result:
A B C
5 baz -2.301539 True
2 baz -0.528172 False
1 bar -0.611756 True
4 bar 0.865408 False
3 foo -1.072969 True
0 foo 1.624345 False
NOTE: sort
is deprecated, use sort_values
instead
One way to do this is to insert a dummy column with the sums in order to sort:
In [10]: sum_B_over_A = df.groupby('A').sum().B
In [11]: sum_B_over_A
Out[11]:
A
bar 0.253652
baz -2.829711
foo 0.551376
Name: B
in [12]: df['sum_B_over_A'] = df.A.apply(sum_B_over_A.get_value)
In [13]: df
Out[13]:
A B C sum_B_over_A
0 foo 1.624345 False 0.551376
1 bar -0.611756 True 0.253652
2 baz -0.528172 False -2.829711
3 foo -1.072969 True 0.551376
4 bar 0.865408 False 0.253652
5 baz -2.301539 True -2.829711
In [14]: df.sort(['sum_B_over_A', 'A', 'B'])
Out[14]:
A B C sum_B_over_A
5 baz -2.301539 True -2.829711
2 baz -0.528172 False -2.829711
1 bar -0.611756 True 0.253652
4 bar 0.865408 False 0.253652
3 foo -1.072969 True 0.551376
0 foo 1.624345 False 0.551376
and maybe you would drop the dummy row:
In [15]: df.sort(['sum_B_over_A', 'A', 'B']).drop('sum_B_over_A', axis=1)
Out[15]:
A B C
5 baz -2.301539 True
2 baz -0.528172 False
1 bar -0.611756 True
4 bar 0.865408 False
3 foo -1.072969 True
0 foo 1.624345 False
ReferenceURL : https://stackoverflow.com/questions/14941366/pandas-sort-by-group-aggregate-and-column
'programing' 카테고리의 다른 글
C #의 정보를 잃지 않고 예외에 메시지를 추가하려면 어떻게해야합니까? (0) | 2021.01.15 |
---|---|
signalR의 재 연결은 언제 발생합니까? (0) | 2021.01.15 |
바이너리 및 텍스트 모드로 작성된 파일의 차이점 (0) | 2021.01.15 |
pdflatex를 조용히 실행 (0) | 2021.01.15 |
현재 WCF 호출에 대한 데이터를 어디에 저장할까요? (0) | 2021.01.15 |