Python(데이터 변형 및 치환)

짬그브·2025년 3월 4일

데이터베이스 스타일로 DataFrame 합치기

Pandas 객체에 저장된 데이터는 여러 내장 함수를 이용해서 합칠 수 있다.

pandas.merge()

하나 이상의 키를 기준으로 DataFrame의 로우를 합친다. SQL이나 다른 관계형 데이터베이스의 join 연산과 유사하다.

left : 머지하려는 DataFrame중 왼쪽에 위치한 DataFrame
right : 머지하려는 DataFrame 중 오른쪽에 위치한 DataFrame
how : 조인 방법('inner','outer','left','right')
on : 조인 하려는 로우 이름
left_on : 조인 키로 사용할 left DataFrame의 칼럼
right_on : 조인 키로 사용할 right DataFrame의 칼럼
left_index : 조인 키로 사용할 left DataFrame의 색인 로우
right_index : 조인 키로 사용할 right DataFrame의 색인 로우
sort : 조인 키에 따라 병합된 데이터를 사전 순으로 정렬
suffixes : 컬럼 이름이 겹칠 경우 각 컬럼 이름 뒤에 붙일 문자열 튜플
copy : False 일 경우, 예외적인 경우에 결과로 데이터가 복사되지 않도록 한다

import pandas as pd

frame1 = pd.DataFrame({'kdata':['b','b','a','c','a','a','b'],
                       'data1':range(7)})
frame2 = pd.DataFrame({'kdata':['a','b','d'],
                       'data2':range(3)})
print(frame1)
print()
print(frame2)
print()

print(pd.merge(frame1,frame2, on='kdata'))
print()
print(pd.merge(frame1,frame2, on='kdata',how='outer'))
print()
print(pd.merge(frame1,frame2, on='kdata',how='left'))
print()
print(pd.merge(frame1,frame2, on='kdata',how='right'))
print()

frame3 = pd.DataFrame({'lkdata':['b','b','a','c','a','a','b'],
                       'data1':range(7)})
frame4 = pd.DataFrame({'rkdata':['a','b','d'],
                       'data2':range(3)})

print(pd.merge(frame3,frame4, left_on='lkdata', right_on='rkdata').
      drop('rkdata',axis=1))

  kdata  data1
0     b      0
1     b      1
2     a      2
3     c      3
4     a      4
5     a      5
6     b      6

  kdata  data2
0     a      0
1     b      1
2     d      2

  kdata  data1  data2
0     b      0      1
1     b      1      1
2     a      2      0
3     a      4      0
4     a      5      0
5     b      6      1

  kdata  data1  data2
0     a    2.0    0.0
1     a    4.0    0.0
2     a    5.0    0.0
3     b    0.0    1.0
4     b    1.0    1.0
5     b    6.0    1.0
6     c    3.0    NaN
7     d    NaN    2.0

  kdata  data1  data2
0     b      0    1.0
1     b      1    1.0
2     a      2    0.0
3     c      3    NaN
4     a      4    0.0
5     a      5    0.0
6     b      6    1.0

  kdata  data1  data2
0     a    2.0      0
1     a    4.0      0
2     a    5.0      0
3     b    0.0      1
4     b    1.0      1
5     b    6.0      1
6     d    NaN      2


  lkdata  data1  data2
0      b      0      1
1      b      1      1
2      a      2      0
3      a      4      0
4      a      5      0
5      b      6      1

import pandas as pd

df_1 = pd.DataFrame({
    '학교':['서울대','서강대','부산대','충남대','경북대'],
    '지역':['서울','서울','부산','대전','대구'],
    '학생수':['10,712','8,179','11,935','10,991','11,314'],
    '학과 수':['56','45','58','51','59'],
    '평균등록금':['2,110,000','5,340,000','2,430,000','2,347,000','2,522,000']},
    columns=['학교','지역','학생수','학과 수','평균등록금'])

df_2 = pd.DataFrame({
    '학교평가등급':['B+','A','A','A-','A+'],
    '학생만족도':['81점','79점','77점','84점','82점'],
    '취업자수':['5,122명','4,987명','5,001명','5,117명','4,777명'],
    'area':['서울','서울','부산','대전','대구'],
    '면적':['9,122','7,101','9,095','8,873','9,002']
})

print(pd.merge(df_1,df_2,  left_on='지역', right_on='area'))
print(pd.merge(df_1,df_2,  left_on='지역', right_on='area').drop('area',axis=1))
# df_3 = pd.merge(df_1,df_2,  left_on='지역', right_on='area')
# df_3.drop(['area'],axis='columns',inplace=True)
# print(df_3)

    학교  지역     학생수 학과 수      평균등록금 학교평가등급 학생만족도    취업자수 area     면적
0  서울대  서울  10,712   56  2,110,000     B+   81점  5,122명   서울  9,122
1  서울대  서울  10,712   56  2,110,000      A   79점  4,987명   서울  7,101
2  서강대  서울   8,179   45  5,340,000     B+   81점  5,122명   서울  9,122
3  서강대  서울   8,179   45  5,340,000      A   79점  4,987명   서울  7,101
4  부산대  부산  11,935   58  2,430,000      A   77점  5,001명   부산  9,095
5  충남대  대전  10,991   51  2,347,000     A-   84점  5,117명   대전  8,873
6  경북대  대구  11,314   59  2,522,000     A+   82점  4,777명   대구  9,002
    학교  지역     학생수 학과 수      평균등록금 학교평가등급 학생만족도    취업자수     면적
0  서울대  서울  10,712   56  2,110,000     B+   81점  5,122명  9,122
1  서울대  서울  10,712   56  2,110,000      A   79점  4,987명  7,101
2  서강대  서울   8,179   45  5,340,000     B+   81점  5,122명  9,122
3  서강대  서울   8,179   45  5,340,000      A   79점  4,987명  7,101
4  부산대  부산  11,935   58  2,430,000      A   77점  5,001명  9,095
5  충남대  대전  10,991   51  2,347,000     A-   84점  5,117명  8,873
6  경북대  대구  11,314   59  2,522,000     A+   82점  4,777명  9,002

pandas.concat()

교집합과 합집합 연결 제공
특정 축의 방향으로 연결

objs : 이어붙일 pandas 객체의 사전이나 리스트
axis : 이어붙일 축 방향
join : 조인 방법('ineer','outer')
join_axes : 합집합/교집합을 수행하는 대신 다른 n-1축으로 사용할 색인을 지정한다.
keys : 이어 붙일 객체나 이어붙인 축에 대한 게층 색인을 생성하는데 연관된 값
levels : 계층 색인 레벨로 사용할 색인을 지정한다.
names : Keys나 levels 혹은 둘 다 있는 경우, 생성된 계층 레벨을 위한 이름
verify : 이어붙인 객체에 중복되는 축이 있는지 검사하고 있다면 예외를 발생시킨다.
integrity : 중복을 허용한다.
Ignore_index : 이어붙인 축의 색인을 유지하지 않고 range로 새로운 색인을 생성한다.

하나의 축을 따라 객체를 이어붙인다.

import pandas as pd
import numpy as np


s1 = pd.Series([0,1], index=list('ab'))
s2 = pd.Series([2,3,4], index=list('cde'))
s3 = pd.Series([5,6], index=list('fg'))
print(s1)
print()
print(s2)
print()
print(s3)
print()

print(pd.concat([s1,s2,s3],axis=0))
print()
print(pd.concat([s1,s2,s3],axis=1))
print()

s4 = pd.concat([s1 * 5,s3])
print(s4)
print()

print(pd.concat([s1,s4],axis=1))
print()
print(pd.concat([s1,s4],axis=1,join='inner'))
print()

print(pd.concat([s1,s4],axis=1))
print()
print(pd.concat([s1,s4],axis=1,join='inner'))
print()

df1 = pd.DataFrame(np.arange(6).reshape(3,2),
                   index=list('abc'),
                   columns=['one','two'])
df2 = pd.DataFrame(np.arange(4).reshape(2,2),
                   index=list('ac'),
                   columns=['three','four'])

print(df1)
print()
print(df2)
print()
print(pd.concat([df1,df2], axis=1))
print()
print(pd.concat([df1,df2],axis=1,keys=['data1','data2']))



a    0
b    1
dtype: int64

c    2
d    3
e    4
dtype: int64

f    5
g    6
dtype: int64

a    0
b    1
c    2
d    3
e    4
f    5
g    6
dtype: int64

     0    1    2
a  0.0  NaN  NaN
b  1.0  NaN  NaN
c  NaN  2.0  NaN
d  NaN  3.0  NaN
e  NaN  4.0  NaN
f  NaN  NaN  5.0
g  NaN  NaN  6.0

a    0
b    5
f    5
g    6
dtype: int64

     0  1
a  0.0  0
b  1.0  5
f  NaN  5
g  NaN  6

   0  1
a  0  0
b  1  5

   one  two
a    0    1
b    2    3
c    4    5

   three  four
a      0     1
c      2     3

   one  two  three  four
a    0    1    0.0   1.0
b    2    3    NaN   NaN
c    4    5    2.0   3.0

  data1     data2     
    one two three four
a     0   1   0.0  1.0
b     2   3   NaN  NaN
c     4   5   2.0  3.0
from operator import index

import pandas as pd

df1 = pd.DataFrame({
    '매출':[10000000,120000000,9000000,6000000,8000000,1100000],
    '비용':[15000000,1300000,1200000,9000000,9900000,9500000]},
index=['1월','2월','3월','4월','5월','6월'])

df2 = pd.DataFrame({
    '매출':[13000000,14000000,17000000,15400000,16500000,16600000],
    '비용':[11000000,10400000,11000000,12100000,9000000,9500000]},
index=['7월','8월','9월','10월','11월','12월'])

# print(df1)
# print(df2)
# print(pd.concat([df1,df2],axis=0))
# df3 = pd.DataFrame(df1['매출']+df1['비용'],columns=['이익'])
# print(df3)
# df4=pd.DataFrame(df2['매출']+df2['비용'],columns=['이익'])
# print(df4)
# print(pd.concat([df3,df4]))
# df5 = pd.concat([df1,df2])
# df6 = pd.concat([df3,df4])
# print(df5)
# print(df6)
# print(pd.concat([df5,df6],axis=1,join='inner'))

df3=pd.concat([df1,df2],axis=0)
print(df3)
print()

df3['이익'] = df3['매출'] - df3['비용']
print(df3)
print()

df3.loc['실적'] = df3.sum(axis=0)
print(df3)

            매출        비용
1월    10000000  15000000
2월   120000000   1300000
3월     9000000   1200000
4월     6000000   9000000
5월     8000000   9900000
6월     1100000   9500000
7월    13000000  11000000
8월    14000000  10400000
9월    17000000  11000000
10월   15400000  12100000
11월   16500000   9000000
12월   16600000   9500000

            매출        비용         이익
1월    10000000  15000000   -5000000
2월   120000000   1300000  118700000
3월     9000000   1200000    7800000
4월     6000000   9000000   -3000000
5월     8000000   9900000   -1900000
6월     1100000   9500000   -8400000
7월    13000000  11000000    2000000
8월    14000000  10400000    3600000
9월    17000000  11000000    6000000
10월   15400000  12100000    3300000
11월   16500000   9000000    7500000
12월   16600000   9500000    7100000

            매출         비용         이익
1월    10000000   15000000   -5000000
2월   120000000    1300000  118700000
3월     9000000    1200000    7800000
4월     6000000    9000000   -3000000
5월     8000000    9900000   -1900000
6월     1100000    9500000   -8400000
7월    13000000   11000000    2000000
8월    14000000   10400000    3600000
9월    17000000   11000000    6000000
10월   15400000   12100000    3300000
11월   16500000    9000000    7500000
12월   16600000    9500000    7100000
실적   246600000  108900000  137700000

겹치는 데이터 합치기



import pandas as pd
import numpy as np

s1 = pd.Series([np.nan, 2.5, np.nan, 4.5, 5.5, np.nan],
               index=list('fedcba'))
s2 = pd.Series(np.arange(len(s1),dtype=np.float32),
               index=list('fedbca'))
print(s1)
print()
print(s2)
print(np.where(pd.isnull(s1),s2,s1))
print()

print(s1.combine_first(s2))
print()

df1 = pd.DataFrame({'d1':[1.,np.nan,5.,np.nan],
                    'd2':[np.nan,2.,np.nan,6.],
                    'd3':range(2,18,4)})
df2 = pd.DataFrame({'d1':[5.,4.,np.nan,3.,7.],
                    'd2':[np.nan,3.,4.,6.,8.]})

print(df1)
print()
print(df2)
print()

print(df1.combine_first(df2))
print()
print(df1.combine_first(df2.iloc[:4]))

f    NaN
e    2.5
d    NaN
c    4.5
b    5.5
a    NaN
dtype: float64

f    0.0
e    1.0
d    2.0
b    3.0
c    4.0
a    5.0
dtype: float32
[0.  2.5 2.  4.5 5.5 5. ]

a    5.0
b    5.5
c    4.5
d    2.0
e    2.5
f    0.0
dtype: float64

    d1   d2  d3
0  1.0  NaN   2
1  NaN  2.0   6
2  5.0  NaN  10
3  NaN  6.0  14

    d1   d2
0  5.0  NaN
1  4.0  3.0
2  NaN  4.0
3  3.0  6.0
4  7.0  8.0

    d1   d2    d3
0  1.0  NaN   2.0
1  4.0  2.0   6.0
2  5.0  4.0  10.0
3  3.0  6.0  14.0
4  7.0  8.0   NaN

    d1   d2  d3
0  1.0  NaN   2
1  4.0  2.0   6
2  5.0  4.0  10
3  3.0  6.0  14

재형성과 피벗

표 형식의 데이터를 재배치하는 연산을 재형성 또는 피벗 연산이라고 한다.

DataFrame 데이터 재배치

stack : 데이터의 칼럼을 로우로 피벗 또는 회전 시킨다.

unstack : 로우를 칼럼으로 피벗시킨다.

from operator import index

import numpy as np
import pandas as pd


data = pd.DataFrame(np.arange(6).reshape(2,3),
                    index=pd.Index(['ohio','colorado'],name='state'),
                    columns=pd.Index(['one','two','three'],name='number'))
print(data)
result = data.stack()
print()
print(result)
print(type(result))
print()

print()
print(result.unstack())
print()
print(result.unstack(level=0))
print()
print(result.unstack('state'))
print()

s1 = pd.Series([0,1,2,3], index=list('abcd'))
s2 = pd.Series([4,5,6], index=list('cde'))
data2 = pd.concat([s1,s2], keys=['one','two'])
print(data2)
print()
print(data2.unstack())
print()
print(data2.unstack(level=0))

number    one  two  three
state                    
ohio        0    1      2
colorado    3    4      5

state     number
ohio      one       0
          two       1
          three     2
colorado  one       3
          two       4
          three     5
dtype: int64
<class 'pandas.core.series.Series'>


number    one  two  three
state                    
ohio        0    1      2
colorado    3    4      5

state   ohio  colorado
number                
one        0         3
two        1         4
three      2         5

state   ohio  colorado
number                
one        0         3
two        1         4
three      2         5

one  a    0
     b    1
     c    2
     d    3
two  c    4
     d    5
     e    6
dtype: int64

       a    b    c    d    e
one  0.0  1.0  2.0  3.0  NaN
two  NaN  NaN  4.0  5.0  6.0

   one  two
a  0.0  NaN
b  1.0  NaN
c  2.0  4.0
d  3.0  5.0
e  NaN  6.0

문제

import numpy as np
import pandas as pd

oa = False
ddata = dict()

while True:
        name = input('이름을 입력하세요:')
        scores = list(map(int,input('국어 영어 수학 점수를 넣어주세요: ').split()))
        ddata[name] = scores
        oa = input('입력을 계속 진행하시겠습니까? (y/n)')
        if oa.lower() == 'n':
            break

frame = pd.DataFrame(ddata, index=['수학','영어','국어'])
print(frame)
print()
print(frame.T.stack())

frame['총점'] = frame.sum(axis=1)
frame['평균'] = frame.iloc[:, :3].mean(axis=1).map(lambda x : round(x,2))

print()
print(frame)
print()
print(frame.T)


이름을 입력하세요:kim
국어 영어 수학 점수를 넣어주세요: 100 90 80
입력을 계속 진행하시겠습니까? (y/n)y
이름을 입력하세요:lim
국어 영어 수학 점수를 넣어주세요: 90 80 70
입력을 계속 진행하시겠습니까? (y/n)y
이름을 입력하세요:hyo
국어 영어 수학 점수를 넣어주세요: 100 99 88
입력을 계속 진행하시겠습니까? (y/n)n
    kim  lim  hyo
수학  100   90  100
영어   90   80   99
국어   80   70   88

kim  수학    100
     영어     90
     국어     80
lim  수학     90
     영어     80
     국어     70
hyo  수학    100
     영어     99
     국어     88
dtype: int64

    kim  lim  hyo   총점     평균
수학  100   90  100  290  96.67
영어   90   80   99  269  89.67
국어   80   70   88  238  79.33

         수학      영어      국어
kim  100.00   90.00   80.00
lim   90.00   80.00   70.00
hyo  100.00   99.00   88.00
총점   290.00  269.00  238.00
평균    96.67   89.67   79.33

피버팅으로 데이터 나열 방식 바꾸기

데이터 베이스나 csv파일에 여러 개의 시계열 데이터를 저장하는 일반적인 방법은 시간순으로 나열하는 방법이다. 이를 위해 pivot()를 지원한다.

pivot 메서드의 처음 두 인자는 로우와 칼럼 색인으로 사용 될 칼럼 이름이고 마지막 value 는 DataFrame에 채워 넣을 값을 담고 있는 칼럼이다.

중복 제거

DataFrame.duplicated(): 중복유무를 알려준다.

함수 매핑을 이용한 데이터 변형

Series.map()

import numpy as np
import pandas as pd

data = pd.DataFrame({'food':['bacon','pulled pork','Bacon','Pastrami','corned beef',
                            'Bacon','pastrami','honey ham','nova lox'],
                    'ounces':[4, 3, 12, 6, 7.5, 8, 3, 5, 6]})
print(data)

meat_to_animal = {
    'bacon':'pig',
    'pulled pork':'pig',
    'pastrami':'cow',
    'corned beef':'cow',
    'honey ham':'pig',
    'nova lox':'salmon'
}

print()
data['animal']= data['food'].map(lambda x : meat_to_animal[x.lower()])
print(data)
print()
data['animal2'] = data['food'].map(str.lower).map(meat_to_animal)
print(data)

          food  ounces
0        bacon     4.0
1  pulled pork     3.0
2        Bacon    12.0
3     Pastrami     6.0
4  corned beef     7.5
5        Bacon     8.0
6     pastrami     3.0
7    honey ham     5.0
8     nova lox     6.0

          food  ounces  animal
0        bacon     4.0     pig
1  pulled pork     3.0     pig
2        Bacon    12.0     pig
3     Pastrami     6.0     cow
4  corned beef     7.5     cow
5        Bacon     8.0     pig
6     pastrami     3.0     cow
7    honey ham     5.0     pig
8     nova lox     6.0  salmon

          food  ounces  animal animal2
0        bacon     4.0     pig     pig
1  pulled pork     3.0     pig     pig
2        Bacon    12.0     pig     pig
3     Pastrami     6.0     cow     cow
4  corned beef     7.5     cow     cow
5        Bacon     8.0     pig     pig
6     pastrami     3.0     cow     cow
7    honey ham     5.0     pig     pig
8     nova lox     6.0  salmon  salmon

값 치환

DataFrame.replace()

import pandas as pd
import numpy as np

# data = pd.Series([1,-999,2,-999,-1000,3])
# print(data)
# print()
# #print(data.replace([-999,-1000], np.nan))
# print(data.replace({-999:np.nan,-1000:0}))

np.random.seed(12345)
data = pd.DataFrame(np.random.randn(1000,4))
print(data.head(10))
print()
print(data.describe())

# data[data>3] = 3
# data[data < -3] = -3
# print()
# print(data.describe())
#
# data2 = np.array([-3,5,7,0,-7,-1,2,-3])
# print(data2)
# print(np.sign(data2))

data[np.abs(data) > 3] = np.sign(data) * 3 # -3 과 3 abs=절대값
print(data.describe())


          0         1         2         3
0 -0.204708  0.478943 -0.519439 -0.555730
1  1.965781  1.393406  0.092908  0.281746
2  0.769023  1.246435  1.007189 -1.296221
3  0.274992  0.228913  1.352917  0.886429
4 -2.001637 -0.371843  1.669025 -0.438570
5 -0.539741  0.476985  3.248944 -1.021228
6 -0.577087  0.124121  0.302614  0.523772
7  0.000940  1.343810 -0.713544 -0.831154
8 -2.370232 -1.860761 -0.860757  0.560145
9 -1.265934  0.119827 -1.063512  0.332883

                 0            1            2            3
count  1000.000000  1000.000000  1000.000000  1000.000000
mean     -0.067684     0.067924     0.025598    -0.002298
std       0.998035     0.992106     1.006835     0.996794
min      -3.428254    -3.548824    -3.184377    -3.745356
25%      -0.774890    -0.591841    -0.641675    -0.644144
50%      -0.116401     0.101143     0.002073    -0.013611
75%       0.616366     0.780282     0.680391     0.654328
max       3.366626     2.653656     3.260383     3.927528
                 0            1            2            3
count  1000.000000  1000.000000  1000.000000  1000.000000
mean     -0.067623     0.068473     0.025153    -0.002081
std       0.995485     0.990253     1.003977     0.989736
min      -3.000000    -3.000000    -3.000000    -3.000000
25%      -0.774890    -0.591841    -0.641675    -0.644144
50%      -0.116401     0.101143     0.002073    -0.013611
75%       0.616366     0.780282     0.680391     0.654328
max       3.000000     2.653656     3.000000     3.000000

축 색인 이름 바꾸기

DataFrame.rename()

import pandas as pd
import numpy as np
data = pd.DataFrame(np.arange(12).reshape(3,4),
                    index=['Ohio','Colorado','New Yokr'],
                    columns=['one','two','three','four'])
print(data.index.map(str.upper),'\n')
data.index = data.index.map(str.upper)
print(data,'\n')

print(data.rename(index=str.title, columns=str.upper),'\n')
print(data.rename(index={'OHIO':'INDIANA'},
                  columns={'three':'peekaboo'}))

Index(['OHIO', 'COLORADO', 'NEW YOKR'], dtype='object') 

          one  two  three  four
OHIO        0    1      2     3
COLORADO    4    5      6     7
NEW YOKR    8    9     10    11 

          ONE  TWO  THREE  FOUR
Ohio        0    1      2     3
Colorado    4    5      6     7
New Yokr    8    9     10    11 

          one  two  peekaboo  four
INDIANA     0    1         2     3
COLORADO    4    5         6     7
NEW YOKR    8    9        10    11

개별화

pandas는 연속성 데이터를 개별로 분할하거나 그룹별로 나누는 과정을 지원한다.

import pandas as pd

ages = [20,22,25,27,21,23,37,31,61,45,41,70,32]
bins = [18,25,35,60,100]  # 18< <=25 ,25< <=35 ,35< <=60 ,60< <=100
cdata = pd.cut(ages,bins)
print(cdata)
print()

cdata2 = pd.cut(ages,bins, right=False)
print(cdata2)
#print(pd.value_counts(cdata2))
print(cdata2.value_counts())
print()

rdata = pd.cut(ages,bins, labels=['Youth','YoungAdult','MiddleAged','Senior'])
print(rdata)
print()
#print(pd.value_counts((rdata)))
print(pd.Series(rdata).value_counts())

[(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (60, 100], (35, 60], (35, 60], (60, 100], (25, 35]]
Length: 13
Categories (4, interval[int64, right]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]]

[[18, 25), [18, 25), [25, 35), [25, 35), [18, 25), ..., [60, 100), [35, 60), [35, 60), [60, 100), [25, 35)]
Length: 13
Categories (4, interval[int64, left]): [[18, 25) < [25, 35) < [35, 60) < [60, 100)]
[18, 25)     4
[25, 35)     4
[35, 60)     3
[60, 100)    2
Name: count, dtype: int64

['Youth', 'Youth', 'Youth', 'YoungAdult', 'Youth', ..., 'Senior', 'MiddleAged', 'MiddleAged', 'Senior', 'YoungAdult']
Length: 13
Categories (4, object): ['Youth' < 'YoungAdult' < 'MiddleAged' < 'Senior']

Youth         5
YoungAdult    3
MiddleAged    3
Senior        2
Name: count, dtype: int64
import pandas as pd

scores = pd.Series([70,88,92,54,34,76,59,91,83,78,61,55],
                   index=['홍길동','이순신','임꺽정','정난정','이이','이황','정도전','이성계','김유신','김철수','정약용','정익전'])
print(scores)

# (0~59:F, 60~69:D, 70~79:C, 80~89:B, 90~100:A)
'''
홍길동 C
이순신 B
'''
print()
sc_cut = pd.cut(scores,[0,59,69,79,89,100],labels=['F','D','C','B','A'])
print(sc_cut)
print()
print(sc_cut.value_counts())
print()

print(pd.concat([scores,sc_cut], axis=1, keys=['정수','학점']))





홍길동    70
이순신    88
임꺽정    92
정난정    54
이이     34
이황     76
정도전    59
이성계    91
김유신    83
김철수    78
정약용    61
정익전    55
dtype: int64

홍길동    C
이순신    B
임꺽정    A
정난정    F
이이     F
이황     C
정도전    F
이성계    A
김유신    B
김철수    C
정약용    D
정익전    F
dtype: category
Categories (5, object): ['F' < 'D' < 'C' < 'B' < 'A']

F    4
C    3
B    2
A    2
D    1
Name: count, dtype: int64

     정수 학점
홍길동  70  C
이순신  88  B
임꺽정  92  A
정난정  54  F
이이   34  F
이황   76  C
정도전  59  F
이성계  91  A
김유신  83  B
김철수  78  C
정약용  61  D
정익전  55  F

문자열 다루기

Pandas 는 정규표현식을 이용한 문자열의 패턴 매칭이나 텍스트 조작을 제공한다.

count : 문자열에서 겹치지 않는 부분 문자열의 개수를 반환한다.
endswith,startswith : 문자열이 주어진 접미사(접두사)로 끝날 경우 True를 반환한다.
join : 문자열을 구분자로 하여 다른 문자열을 순서대로 이어 붙인다.
index : 부분 문자열의 첫 번째 글자의 위치를 반환한다.
find : 첫 번째 부분 문자열의 첫번째 글자의 위치를 반환한다.
rfind : 마지막 부분 문자열의 첫 번째 글자의 위치를 반환한다.
replace : 문자열을 다른 문자열로 치환한다.
split : 문자열을 구분자 기준으로 부분 문자열의 리스트로 분리한다.
ljust,rjust : 문자열을 오른쪽 혹은 왼쪽을 정렬하고 주어진 길이에서 문자열 길이를 제외한 곳은 공백 문자를 채워 넣어 주어진 길이를 가지는 문자열을 반환한다.

정규표현식

정규표현식은 텍스트에서 문자열 패턴을 찾는 유연한 방법을 제공한다.

정규표현식 메서드

findall,finditer : 문자열에서 겹치지 않는, 발견된 모든 패턴을 반환한다.
match : 문자열의 시작점부터 패턴을 찾고 선택적으로 패턴 컴포넌트를 그룹으로 나눈다. 일치하는 패턴이 있다면 match 객체를 반환하고, 그렇지 않을 경우 None을 반환한다.
search : 문자열에서 패턴과 일치하는 내용을 검색하고 match 객체를 반환한다.
split : 문자열에서 패턴과 일치하는 부분을 쪼갠다.
sub,subn : 문자열에서 일치하는 모든 패턴(sub)혹은 처음 n개의 패턴을 대체 표현으로 치환한다. 대체 표현 문자열은 \1,\2,... 같은 기호를 사용해서 매치 그룹의 요소를 참조한다.

profile
+AI to AI+

0개의 댓글