pandas ์ž…๋ฌธ 1

c.haha.eยท2025๋…„ 3์›” 24์ผ

pandas

๋ชฉ๋ก ๋ณด๊ธฐ
1/17

๐Ÿ“Œ Pandas ์„ค์น˜ ๋ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

!pip install pandas
import pandas as pd

๐Ÿ“Œ Series์™€ DataFrame ์ดํ•ดํ•˜๊ธฐ

  • Series: 1์ฐจ์› ๋ฐ์ดํ„ฐ (์ˆซ์ž, ๋ฌธ์ž์—ด ๋“ฑ)
# Series ์˜ˆ์‹œ
s = pd.Series([10, 20, 30])
print(s)
  • DataFrame: 2์ฐจ์› ๋ฐ์ดํ„ฐ (์—‘์…€์ฒ˜๋Ÿผ ํ–‰๊ณผ ์—ด์ด ์žˆ์Œ)
# DataFrame ์˜ˆ์‹œ
data = {
    '์ด๋ฆ„': ['์ฒ ์ˆ˜', '์˜ํฌ', '๋ฏผ์ˆ˜'],
    '๋‚˜์ด': [10, 12, 11]
}
df = pd.DataFrame(data)
print(df)

๐Ÿ“Œ CSV ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

df = pd.read_csv('ํŒŒ์ผ์ด๋ฆ„.csv')  # ํŒŒ์ผ์ด .xlsx๋ผ๋ฉด ๋ฑ์ŠคํŠธ๊ธฐ๋ฐ˜๋ฒ„์ „ ๋ณดํ†ต .csv๋งŽ์ด์‚ฌ์šฉ
print(df)

๐Ÿ“Œ ๋ฐ์ดํ„ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

df.head()      # ์ฒ˜์Œ 5ํ–‰
df.tail()      # ๋งˆ์ง€๋ง‰ 5ํ–‰
df.info()      # ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๊ฒฐ์ธก์น˜ ํ™•์ธ
df.describe()  # ์ˆซ์ž ๋ฐ์ดํ„ฐ ์š”์•ฝ ํ†ต๊ณ„

๐Ÿ“Œ ์—ด(Column) ์„ ํƒํ•˜๊ธฐ

df['๊ตญ์–ด']      # ํŠน์ • ์—ด๋งŒ ๋ณด๊ธฐ  -> Series(1์ฐจ์›๋ฐ์ดํ„ฐ)
df[['๊ตญ์–ด', '์ˆ˜ํ•™']]  # ์—ฌ๋Ÿฌ ์—ด ๋ณด๊ธฐ  -> DataFrame(2์ฐจ์›๋ฐ์ดํ„ฐ)

๐Ÿ“Œ ์กฐ๊ฑดํ•„ํ„ฐ๋ง : ์กฐ๊ฑด์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ฝ‘๊ธฐ(ํ•„ํ„ฐ๋ง)

import pandas as pd

data = {
    '์ด๋ฆ„': ['์ฒ ์ˆ˜', '์˜ํฌ', '๋ฏผ์ˆ˜', '์ง€๋ฏผ'],
    '๊ตญ์–ด': [90, 80, 85, 95],
    '์ˆ˜ํ•™': [88, 92, 79, 100]
}


df = pd.read_csv(data)
print(df)

# ์ˆ˜ํ•™์ ์ˆ˜๊ฐ€ 90์  ์ด์ƒ์ธ ํ•™์ƒ๋งŒ ๋ณด๊ธฐ
df[df['์ˆ˜ํ•™'] >= 90 ]

# ๊ตญ์–ด์ ์ˆ˜๊ฐ€ 85์  ๋ฏธ๋งŒ์ธ ํ•™์ƒ ๋ณด๊ธฐ
df[df['๊ตญ์–ด'] < 85 ]

df['์ˆ˜ํ•™'] >= 90  
# ์ด๋ ‡๊ฒŒ๋งŒ ์ถœ๋ ฅํ•˜๋ฉด 
# ๋ˆ„๊ฐ€ ์กฐ๊ฑด์— ๋งž๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š”'True', 'False'๋กœ๋งŒ ์ถœ๋ ฅ๋จ
# ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ ์‹ถ์œผ๋ฉด df[์กฐ๊ฑด]
# ์ด๋ ‡๊ฒŒ df[] ํ•œ๋ฒˆ๋” ๊ฐ์‹ธ์ค˜์•ผ ๊ทธ ์กฐ๊ฑด์— ๋งž๋Š” row(ํ–‰)์„ ๋ฝ‘์„ ์ˆ˜ ์žˆ์Œ. 

df[]

๐Ÿ“Œ ์ •๋ ฌํ•˜๊ธฐ[ .sort_values(by= , ascending= ) ]

defult๋Š” True ์˜ค๋ฆ„์ฐจ์ˆœ


# ์ด์ ์ด ๋†’์€ ์ˆœ
df.sort_values(by='์ด์ ', ascending=False)

# ํ‰๊ท ์ด ๋‚ฎ์€ ์ˆœ
df.sort_values(by='ํ‰๊ท ', ascending=True)

๐Ÿ“Œ ์—ด ์ถ”๊ฐ€ํ•˜๊ธฐ

# ๊ตญ์–ด + ์ˆ˜ํ•™ ์ ์ˆ˜๋กœ ์ด์  ์—ด ์ถ”๊ฐ€

df['์ด์ '] = df['๊ตญ์–ด'] + df['์ˆ˜ํ•™']
df['ํ‰๊ท '] = df['์ด์ '] / 2
print(df)

๐Ÿ“Œ ํ–‰ ์ถ”๊ฐ€ํ•˜๊ธฐ(์ƒˆ๋กœ์šด ํ•™์ƒ ์ถ”๊ฐ€)

import pandas as pd

# ๊ธฐ์กด ๋ฐ์ดํ„ฐ
data = {
    '์ด๋ฆ„': ['์ฒ ์ˆ˜', '์˜ํฌ', '๋ฏผ์ˆ˜', '์ง€๋ฏผ'],
    '๊ตญ์–ด': [90, 80, 85, 95],
    '์ˆ˜ํ•™': [88, 92, 79, 100]
}
df = pd.DataFrame(data)

# ์ƒˆ ํ•™์ƒ ์ถ”๊ฐ€
new_student = {'์ด๋ฆ„': 'ํ•˜๋Š˜', '๊ตญ์–ด': 85, '์ˆ˜ํ•™': 87}
df = pd.concat([df, pd.DataFrame([new_student])], ignore_index=True)

# df.loc[len(df)] = ['ํ•˜๋Š˜', 85, 87]

print(df)

๐Ÿ‘‰ 1. concat() : ์ถ”๊ฐ€ํ•  ๋ฐ์ดํ„ฐ ์–‘์ด ๋งŽ์„ ๋•Œ

df = pd.concat([df, pd.DataFrame([new_student])], ignore_index=True)
  1. new_student = { ... } : ์ถ”๊ฐ€ํ•  ํ•™์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ
  2. pd.DataFrame([new_student]) : ์ถ”๊ฐ€ํ•™์ƒ ๋”•์…”๋„ˆ๋ฆฌ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๊ฐ์‹ธ์„œ DataFrameํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ
  3. pd.concat([๊ธฐ์กดDataFrame, ์ถ”๊ฐ€ํ• DataFrame] : ๊ธฐ์กดDataFrame ๊ณผ ์ถ”๊ฐ€ํ• DataFrame๋ฅผ ๋ถ™์—ฌ์ฃผ๊ธฐ
  • concat() : ๋‘ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ ๋ถ™์—ฌ์ฃผ๋Š” ํ•จ์ˆ˜
  1. pd.concat([df, pd.DataFrame([new_student])], ignore_index=True) : ์ƒˆ๋กœ ์ธ๋ฑ์Šค๋ฅผ ๋งค๊น€
  • ignore_index=False : ๊ธฐ์กด ๊ฐ DataFrame๋“ค์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€(๊ฒน์นจ) -> defult
  • ignore_index=True : ์ธ๋ฑ์Šค๊ฐ€ ๋‘ DataFrame์„ ํ•ฉ์นœ ํ›„ 0๋ถ€ํ„ฐ ์ƒˆ๋กœ ๋งค๊น€.
  • axis = 0 : ํ–‰์œผ๋กœ ๋ถ™์Œ -> defult
  • axis = 1 : ์—ด๋กœ ๋ถ™์Œ
  • pd.concat([df, pd.DataFrame([new_student])], ignore_index=True)๋Š”
    pd.concat([df, pd.DataFrame([new_student])], axis = 0, ignore_index=True)์™€ ๊ฐ™๋‹ค๊ณ  ๋ณด๋ฉด๋จ.

๐Ÿ‘‰ 2. loc : ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•  ๋•Œ

df.loc[len(df)] = ['ํ•˜๋Š˜', 85, 87]

len(df) : df์—๋Š” ํ˜„์žฌ 4๋ช…('์ฒ ์ˆ˜', '์˜ํฌ', '๋ฏผ์ˆ˜', '์ง€๋ฏผ')์ด ์žˆ์Œ. ๋”ฐ๋ผ์„œ 4๋ฅผ ๋ฐ˜ํ™˜
df.loc[4] : ํ–‰ Label 4๋ฒˆ์งธ๋ฅผ ๋งํ•จ.
df.loc[4] = ['ํ•˜๋Š˜', 85, 87] : ํ–‰ Label 4๋ฒˆ์งธ์— ['ํ•˜๋Š˜', 85, 87] ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€.

๐Ÿ“Œ ๊ฐœ์ธ์ ์œผ๋กœ ํ—ท๊ฐˆ๋ ธ๋˜ ๋ถ€๋ถ„

๐Ÿ‘‰ loc / iloc ์ฐจ์ด

๊ตฌ๋ถ„lociloc
๊ธฐ์ค€๋ผ๋ฒจ(Label, ์ด๋ฆ„) ๊ธฐ์ค€์ธ๋ฑ์Šค ๋ฒˆํ˜ธ(Index) ๊ธฐ์ค€
ํ–‰ ์„ ํƒ์ธ๋ฑ์Šค ์ด๋ฆ„ ('์ฒ ์ˆ˜')ํ–‰ ๋ฒˆํ˜ธ (0, 1, 2...)
์—ด ์„ ํƒ์—ด ์ด๋ฆ„ ('์ˆ˜ํ•™')์—ด ๋ฒˆํ˜ธ (0, 1, 2...)
์˜ˆ์‹œdf.loc['์ฒ ์ˆ˜', '์ˆ˜ํ•™']df.iloc[0, 2]
ํŠน์ง•์ง๊ด€์ , ์˜๋ฏธ ๋ช…ํ™•๋ฐ˜๋ณต๋ฌธ, ์ˆซ์ž ๊ธฐ์ค€ ์ฒ˜๋ฆฌ์— ์œ ๋ฆฌ

๐Ÿ‘‰ df.loc[ํ–‰, ์—ด], df.loc[ํ–‰, [์—ด]] ํ˜•ํƒœ๋ณ„ ์ฐจ์ด

df.loc['์ฒ ์ˆ˜', '์ˆ˜ํ•™']
# ๊ฒฐ๊ณผ: 88 (๊ฐ’ ํ•˜๋‚˜ - int)
df.loc['์ฒ ์ˆ˜', ['์ˆ˜ํ•™']]  # ๋ฆฌ์ŠคํŠธ๋กœ ์—ด์„ ๋„˜๊ธฐ๋ฉด 1๊ฐœ๋ผ๋„ Series ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜๋จ (ํ‘œ์ฒ˜๋Ÿผ ๋‹ค๋ฃธ)
# ๊ฒฐ๊ณผ:
# ์ˆ˜ํ•™    88
# Name: ์ฒ ์ˆ˜, dtype: int64
# (Series๋กœ ๋ฐ˜ํ™˜๋จ)
df.loc['์ฒ ์ˆ˜', ['๊ตญ์–ด', '์ˆ˜ํ•™']]   
# ๊ฒฐ๊ณผ:
# ๊ตญ์–ด    90
# ์ˆ˜ํ•™    88
# Name: ์ฒ ์ˆ˜, dtype: int64

๐Ÿ‘‰ 'df[์กฐ๊ฑด]['์ปฌ๋Ÿผ']' VS 'df[][]' ์ฐจ์ด

# ์กฐ๊ฑด์œผ๋กœ '์˜ํฌ'์ธ ํ–‰๋งŒ ๊ณ ๋ฅด๊ณ , ๊ทธ ์•ˆ์—์„œ '์ˆ˜ํ•™' ์—ด๋งŒ ์„ ํƒ

df[df['์ด๋ฆ„'] == '์˜ํฌ']['์ˆ˜ํ•™']

df[์กฐ๊ฑด]['์—ด'] ์ด ๋ถ€๋ถ„์„ ๋ณด๊ณ 
df[][] ์ด๋Ÿฐ ํ˜•์‹์ด ๋‹ค ๋˜๋Š” ์ค„ ์•Œ์•˜๋‹ค.
์•ž์ชฝ์— dataframeํ˜•์‹์ด์˜ค๋ฉด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์•ž์ชฝ์— seriesํ˜•์‹์ด ์˜ค๋ฉด ์•ˆ๋จ.

๐Ÿ‘‰ df[['์ปฌ๋Ÿผ1','์ปฌ๋Ÿผ2']]

์—ฌ๋Ÿฌ ์—ด์„ ์ถœ๋ ฅํ•  ๋•Œ์—๋Š” ์ถœ๋ ฅํ•˜๋ ค๋Š” ์ปฌ๋Ÿผ ['์ปฌ๋Ÿผ1','์ปฌ๋Ÿผ2'] ์„ ํ•œ๋ฒˆ ๋” df[] ์”Œ์–ด์ค˜์•ผ dataframeํ˜•์‹์ด ๋จ.

df['์ปฌ๋Ÿผ1','์ปฌ๋Ÿผ2'] ๋Š” ๋ฌธ๋ฒ•์˜ค๋ฅ˜๋ผ ์•ˆ๋จ.

profile
๊ธฐ๋ก์šฉ ๋ธ”๋กœ๊ทธ

0๊ฐœ์˜ ๋Œ“๊ธ€