๊ฐœ๋ฐœ Code/ํŒŒ์ด์ฌ Python

[Python][pandas] ๋ฐ์ดํ„ฐ ์ •๋ ฌํ•˜๊ธฐ - Sort

5hr1rnp 2025. 1. 30. 13:01
๋ฐ˜์‘ํ˜•

 

  ์•„๋ž˜ ๊ธ€์€ Pandas์—์„œ DataFrame ๋ฐ์ดํ„ฐ ์ •๋ ฌ๊ณผ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ •๋ฆฌํ•œ ๊ฒƒ์ด๋‹ค.
  ์ฃผ์š” ๋ฉ”์„œ๋“œ์ธ sort_values(), sort_index() ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ nlargest(), nsmallest(), reindex(), ๊ทธ๋ฆฌ๊ณ  sort_values()์˜ key ํŒŒ๋ผ๋ฏธํ„ฐ๊นŒ์ง€ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค.


1. DataFrame.sort_values()


  • ์—ด(column) ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๊ณ  ํ•ต์‹ฌ์ ์ธ ๋ฉ”์„œ๋“œ(method)
  • by ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ธฐ์ค€ ์—ด(๋˜๋Š” ์—ด์˜ ๋ฆฌ์ŠคํŠธ)์„ ์ง€์ •ํ•˜๊ณ , ascending์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ/๋‚ด๋ฆผ์ฐจ์ˆœ์„ ์„ค์ •ํ•จ

 

# pandas.__version__
# 2.2.3

import pandas as pd

df = pd.DataFrame({
    'A': [3, 1, 2, 4],
    'B': [10, 50, 20, 20],
    'C': ['b', 'a', 'b', 'c']
})

# 1) ๋‹จ์ผ ์—ด ๊ธฐ์ค€ ์ •๋ ฌ
df_sorted_single = df.sort_values(by='A')
print(df_sorted_single)

#    A   B  C
# 1  1  50  a
# 2  2  20  b
# 0  3  10  b
# 3  4  20  c

# 2) ์—ฌ๋Ÿฌ ์—ด ๊ธฐ์ค€ ์ •๋ ฌ
df_sorted_multi = df.sort_values(by=['B', 'A'], ascending=[True, False])
print(df_sorted_multi)

#    A   B  C
# 0  3  10  b
# 3  4  20  c
# 2  2  20  b
# 1  1  50  a

ํŒŒ๋ผ๋ฏธํ„ฐ ์ฃผ์š” ์ •๋ฆฌ

  • by: ์ •๋ ฌ ๊ธฐ์ค€ ์—ด ์ด๋ฆ„(๋ฌธ์ž์—ด) ๋˜๋Š” ์—ด ์ด๋ฆ„ ๋ฆฌ์ŠคํŠธ
  • ascending: ๊ธฐ๋ณธ๊ฐ’์€ True(์˜ค๋ฆ„์ฐจ์ˆœ)์ด๋ฉฐ, ์—ฌ๋Ÿฌ ์—ด์„ ์ง€์ •ํ•  ๊ฒฝ์šฐ [True, False] ๋“ฑ ๋ฆฌ์ŠคํŠธ๋กœ๋„ ์„ค์ • ๊ฐ€๋Šฅ
  • inplace: True๋กœ ํ•˜๋ฉด ์›๋ณธ DataFrame์„ ์ˆ˜์ •ํ•จ
  • na_position: NaN ๊ฐ’์˜ ์œ„์น˜๋ฅผ 'first' ๋˜๋Š” 'last'๋กœ ์ง€์ • (๊ธฐ๋ณธ๊ฐ’์€ 'last')
  • key: (Pandas 1.1.0+ ๋ฒ„์ „) ์—ด์— ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Œ
# ์˜ˆ์‹œ: ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด ์ •๋ ฌ
df.sort_values(by='C', key=lambda col: col.str.lower())

2. DataFrame.sort_index()


  • ์ธ๋ฑ์Šค(ํ–‰ ๋ผ๋ฒจ)์ด๋‚˜ ์ปฌ๋Ÿผ ๋ผ๋ฒจ์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•  ๋•Œ ์‚ฌ์šฉํ•จ
  • axis ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ–‰ ์ธ๋ฑ์Šค(axis=0) ๋˜๋Š” ์—ด(axis=1) ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Œ
# pandas.__version__
# 2.2.3

import pandas as pd

df = pd.DataFrame({
    'A': [3, 1, 2],
    'B': [2, 3, 1]
}, index=['c', 'a', 'b'])

# ์ธ๋ฑ์Šค๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
df_sorted_index = df.sort_index()
print(df_sorted_index)

#    A  B
# a  1  3
# b  2  1
# c  3  2

# ์ธ๋ฑ์Šค๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
df_sorted_index_desc = df.sort_index(ascending=False)
print(df_sorted_index_desc)

#    A  B
# c  3  2
# b  2  1
# a  1  3

# ์ปฌ๋Ÿผ๋ช…์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ
df_sorted_columns = df.sort_index(axis=1)
print(df_sorted_columns)

#    A  B
# c  3  2
# a  1  3
# b  2  1

ํŒŒ๋ผ๋ฏธํ„ฐ ์ฃผ์š” ์ •๋ฆฌ

  • axis: ๊ธฐ๋ณธ๊ฐ’ 0(ํ–‰ ์ธ๋ฑ์Šค), 1์ด๋ฉด ์—ด ๊ธฐ์ค€ ์ •๋ ฌ
  • ascending: ๊ธฐ๋ณธ๊ฐ’ True
  • inplace: True๋กœ ํ•˜๋ฉด ์›๋ณธ์— ๋ฐ˜์˜

728x90
๋ฐ˜์‘ํ˜•

3. nlargest(), nsmallest()


  • ํŠน์ • ์—ด ๊ธฐ์ค€์œผ๋กœ ๊ฐ€์žฅ ํฐ(๋˜๋Š” ๊ฐ€์žฅ ์ž‘์€) n๊ฐœ ํ–‰์„ ๋น ๋ฅด๊ฒŒ ๋ฝ‘์•„๋‚ด๋Š” ๋ฉ”์„œ๋“œ
  • ์ •๋ ฌ ํ›„ ์ƒ์œ„ n๊ฐœ๋งŒ ์ทจํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋‚ด๋ถ€์ ์œผ๋กœ ์ตœ์ ํ™” ๋˜์–ด์žˆ์Œ
  • ์—ฌ๋Ÿฌ ์—ด์„ ๋Œ€์ƒ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฃผ๋กœ ๋‹จ์ผ ์—ด ๊ธฐ์ค€์œผ๋กœ ์“ฐ์ž„
# ์ƒ์œ„ 3๊ฐœ
df_top3 = df.nlargest(3, 'B')

#    A  B
# a  1  3
# c  3  2
# b  2  1

# ํ•˜์œ„ 3๊ฐœ
df_bottom3 = df.nsmallest(3, 'B')

#    A  B
# b  2  1
# c  3  2
# a  1  3

4. reindex()


  • ์ธ๋ฑ์Šค(ํ–‰/์—ด)์„ ์ƒˆ๋กญ๊ฒŒ ๋งคํ•‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • ์ •๋ ฌ ์ „์šฉ ๋ฉ”์„œ๋“œ๋Š” ์•„๋‹ˆ์ง€๋งŒ, ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๊ณ  reindexํ•˜๋ฉด ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ •๋ ฌ ํšจ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚จ
sorted_idx = sorted(df.index)  # ์ •๋ ฌ๋œ ์ธ๋ฑ์Šค ๋ฆฌ์ŠคํŠธ
df_reindexed = df.reindex(sorted_idx)
print(df_reindexed)

#    A  B
# a  1  3
# b  2  1
# c  3  2

5. ๋ฉ€ํ‹ฐ ์ธ๋ฑ์Šค(MultiIndex)์˜ ์ •๋ ฌ


  • MultiIndex๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ฉด level ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ํŠน์ • ๋ ˆ๋ฒจ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Œ
  • ์˜ˆ์ „์—๋Š” sortlevel()์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์—ˆ์œผ๋‚˜, ํ˜„์žฌ๋Š” sort_index(level=...)๋กœ ๋Œ€์ฒด๋˜์—ˆ์Œ
df_multi = df.sort_index(level=[0, 1], ascending=[True, False])

์ •๋ฆฌ


  1. sort_values()
    • ์—ด ๊ธฐ์ค€ ์ •๋ ฌ ๋ฉ”์„œ๋“œ. ์˜ค๋ฆ„์ฐจ์ˆœ/๋‚ด๋ฆผ์ฐจ์ˆœ, ์—ฌ๋Ÿฌ ์—ด ๋™์‹œ ์ •๋ ฌ ๊ฐ€๋Šฅ
    • ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋จ
    • key ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ปค์Šคํ…€ ์ •๋ ฌ๋„ ๊ฐ€๋Šฅ
  2. sort_index()
    • ์ธ๋ฑ์Šค(ํ–‰/์—ด ๋ผ๋ฒจ) ๊ธฐ์ค€ ์ •๋ ฌ ๋ฉ”์„œ๋“œ
    • axis๋กœ ํ–‰/์—ด์„ ๊ตฌ๋ถ„, ascending์œผ๋กœ ์ •๋ ฌ ๋ฐฉํ–ฅ ์ง€์ •
  3. nlargest(), nsmallest()
    • ์ง€์ •๋œ ์—ด์—์„œ ์ƒ์œ„/ํ•˜์œ„ n๊ฐœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœ
    • ์ผ์ข…์˜ ‘๋ถ€๋ถ„ ์ •๋ ฌ’์— ํ•ด๋‹นํ•˜๋ฉฐ, ์†๋„๊ฐ€ ๋” ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
  4. reindex()
    • ์ •๋ ฌ์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š”, ์ƒˆ๋กœ์šด ์ธ๋ฑ์Šค ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ DataFrame ์ธ๋ฑ์Šค๋ฅผ ์žฌ๋ฐฐ์—ดํ•˜๋Š” ๋ฉ”์„œ๋“œ
    • ์›ํ•˜๋Š” ๋Œ€๋กœ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ•์ œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
  5. ๋ฉ€ํ‹ฐ ์ธ๋ฑ์Šค ์ •๋ ฌ
    • sort_index(level=...)๋ฅผ ํ†ตํ•ด ๋ ˆ๋ฒจ๋ณ„๋กœ ์„ธ๋ฐ€ํ•œ ์ •๋ ฌ ๊ฐ€๋Šฅ

๋ณดํ†ต์€ sort_values()์™€ sort_index()๋งŒ ์ œ๋Œ€๋กœ ์•Œ์•„๋„ ์ •๋ ฌ ์ž‘์—…์€ ๋‹ค ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•จ
์ถ”๊ฐ€์ ์œผ๋กœ ์ƒํ•˜์œ„ ๋ฐ์ดํ„ฐ๋งŒ ๋น ๋ฅด๊ฒŒ ๋ฝ‘๊ณ  ์‹ถ๋‹ค๋ฉด nlargest(), nsmallest()๋ฅผ ์“ฐ๋ฉด ๋จ
key ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ๋ฉ€ํ‹ฐ ์ธ๋ฑ์Šค ๋“ฑ, ์กฐ๊ธˆ ๋” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋„ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์„ ํƒํ•˜๋ฉด ๋จ

๋ฐ˜์‘ํ˜•