Python Library_Pandas6(행렬 적용, 데이터 프레임 인덱스 조작, 데이터 합성)

ABC Boot Camp_2023.03.27


변환 적용

행 또는 열에 반복적으로 적용됨
원하는 값에 함수 적용 가능

df3 = pd.DataFrame({
    'A' :(1, 3, 4, 3, 4),
    'B' :(2, 3, 1, 2, 3),
    'C' :(1, 5, 2, 4, 4) 
})
df3
>>>

    A	B	C
0	1	2	1
1	3	3	5
2	4	1	2
3	3	2	4
4	4	3	4
df3.apply(lambda x : x.max() - x.min())    #열의 최대값-최소값
>>>
A    3
B    2
C    4

df3.apply(lambda x : x.max() - x.min(), axis=1)  #행의 최대값-최소값
>>>
0    1
1    2
2    3
3    2
4    1

df3.apply(pd.value_counts)  #열 기준 갯수
>>>
	A	B	C
1	1.0	1.0	1.0
2	NaN	2.0	1.0
3	2.0	2.0	NaN
4	2.0	NaN	2.0
5	NaN	NaN	1.0


데이터 프레임 인덱스 조작


– set_index: 기존 행 인덱스를 제거하고 데이터 열 중 하나를 인덱스로 설정

– reset_index: 기존 행 인덱스를 제거하고 인덱스를 데이터 열로 추가


np.random.seed(0)
df1 = pd.DataFrame(np.vstack((list('ABCDE'),
                             np.round(np.random.rand(3,5),2))).T,
                  columns=("C1","C2","C3","C4"))
df1
>>>
	C1	C2	C3	C4
0	A	0.55	0.65	0.79
1	B	0.72	0.44	0.53
2	C	0.6	0.89	0.57
3	D	0.54	0.96	0.93
4	E	0.42	0.38	0.07


df1.index
>>>
RangeIndex(start=0, stop=5, step=1)

df2 = df1.set_index("C1")
df2
>>>
	C2	C3	C4
C1			
A	0.55	0.65	0.79
B	0.72	0.44	0.53
C	0.6	0.89	0.57
D	0.54	0.96	0.93
E	0.42	0.38	0.07


df2.set_index("C2")  #기존 인덱스는 없어짐
>>>
	C3	C4
C2		
0.55	0.65	0.79
0.72	0.44	0.53
0.6	0.89	0.57
0.54	0.96	0.93
0.42	0.38	0.07


데이터 합성

병합 기능으로 데이터 프레임 병합

하나. 데이터 합성

1) df1 데이터 프레임 생성

df1 = pd.DataFrame({
    '고객번호' : (1001, 1002, 1003, 1004, 1005, 1006, 1007),
    '이름' : ('둘리','도우너','또치','길동', '희동', '마이콜', '영희')
}, columns=('고객번호','이름'))
df1
>>>
	고객번호	이름
0	1001	둘리
1	1002	도우너
2	1003	또치
3	1004	길동
4	1005	희동
5	1006	마이콜
6	1007	영희

2) df2 데이터 프레임 생성

df2 = pd.DataFrame({
    '고객번호' : (1001, 1001, 1005, 1006, 1008, 1001),
    '금액' : (10000, 20000, 15000, 5000, 100000, 30000)
}, columns=('고객번호','금액'))
df2
>>>
	고객번호	금액
0	1001	10000
1	1001	20000
2	1005	15000
3	1006	5000
4	1008	100000
5	1001	30000

3) df1 및 df2 데이터의 공통 키를 기반으로 df1 및 df2 데이터 합성

동일한 키를 가진 데이터가 병합됩니다(겹치다_inner join) / how = ‘inner는 생략 가능

#고객번호 기준 합성, inner join(교집합)
pd.merge(df1,df2)
>>>

    고객번호	 이름	 금액
0	1001	둘리	10000
1	1001	둘리	20000
2	1001	둘리	30000
3	1005	희동	15000
4	1006	마이콜	5000

3) df1, df2 데이터 구성_ df1, df2 모든 키 값(노동 조합_외부 조인)

pd.merge(df1, df2, how ='outer')   #outer join, 합집합
>>>
	고객번호	이름	금액
0	1001	둘리	10000.0
1	1001	둘리	20000.0
2	1001	둘리	30000.0
3	1002	도우너	NaN
4	1003	또치	NaN
5	1004	길동	NaN
6	1005	희동	15000.0
7	1006	마이콜	5000.0
8	1007	영희	NaN
9	1008	NaN	100000.0

4) df1, df2 데이터 합성_ df1의 모든 값은 왼쪽 참조(links=df1)

pd.merge(df1,df2,how='left')
>>>
	고객번호	이름	금액
0	1001	둘리	10000.0
1	1001	둘리	20000.0
2	1001	둘리	30000.0
3	1002	도우너	NaN
4	1003	또치	NaN
5	1004	길동	NaN
6	1005	희동	15000.0
7	1006	마이콜	5000.0
8	1007	영희	NaN

5) df1, df2 데이터 합성_ 오른쪽과 관련된 df2의 모든 값(right=df2)

pd.merge(df1,df2,how='right')   
>>>
	고객번호	이름	금액
0	1001	둘리	10000
1	1001	둘리	20000
2	1005	희동	15000
3	1006	마이콜	5000
4	1008	NaN	100000
5	1001	둘리	30000

— 관행

더보기

1) df1 데이터 프레임 생성

df1 = pd.DataFrame({
    '품종' : ('setosa', 'setosa', 'virginica', 'virginica'),
    '꽃잎길이' : (1.4, 1.3, 1.5, 1.3)
}, columns = ('품종', '꽃잎길이'))
df1
>>>

    품종	꽃잎길이
0	setosa	1.4
1	setosa	1.3
2	virginica	1.5
3	virginica	1.3

2) df2 데이터 프레임 만들기

df2 = pd.DataFrame({
    '품종' : ('setosa', 'virginica', 'virginica', 'versicolor'),
    '꽃잎너비' : (0.4, 0.3, 0.5, 0.3)
}, columns = ('품종', '꽃잎너비'))
df2
>>>
	품종	꽃잎너비
0	setosa	0.4
1	virginica	0.3
2	virginica	0.5
3	versicolor	0.3

3) df1 및 df2 데이터 결합(내부 조인)

pd.merge(df1,df2)
>>>
	품종	꽃잎길이	꽃잎너비
0	setosa	1.4	0.4
1	setosa	1.3	0.4
2	virginica	1.5	0.3
3	virginica	1.5	0.5
4	virginica	1.3	0.3
5	virginica	1.3	0.5

2. 데이터 합성 – 동일한 키 값을 가진 날짜가 여러 개 있는 경우

on = ‘설정할 컬럼명’

1) df1, df2 데이터 프레임 생성

df1 = pd.DataFrame({
    '고객명' : ('춘향','춘향', '몽룡'),
    '날짜' : ('2018-01-01', '2018-01-02', '2018-01-01'),
    '데이터' : ('20000', '30000', '100000')
})
df1
>>>
	고객명	날짜	데이터
0	춘향	2018-01-01	20000
1	춘향	2018-01-02	30000
2	몽룡	2018-01-01	100000


df2 = pd.DataFrame({
    '고객명' : ('춘향', '몽룡'),
    '데이터' : ('여자', '남자')
})
df2
>>>
	고객명	데이터
0	춘향	여자
1	몽룡	남자

2) 고객명과 데이터가 있으므로 고객명을 키로 선택 / df1과 df2의 데이터 값이 다르기 때문에

on = ‘고객 이름’

pd.merge(df1, df2, on='고객명')
>>>
	고객명	날짜	데이터_x	데이터_y
0	춘향	2018-01-01	20000	여자
1	춘향	2018-01-02	30000	여자
2	몽룡	2018-01-01	100000	남자

삼. 데이터 합성 열 값이 다른 데이터

1) df1, df2 데이터 프레임 생성

df1 = pd.DataFrame({
    '이름' : ('영희','철수', '철수'),
    '성적' : (22, 100, 38)
})
df1
>>>
	이름	성적
0	영희	22
1	철수	100
2	철수	38


df2 = pd.DataFrame({
    '성명' : ('영희','영희', '철수'),
    '성적' : (40, 63, 88)
})
df2
>>>

성명	성적
0	영희	40
1	영희	63
2	철수	88

2) 키의 양쪽에 있는 이름이 다른 경우 기준으로 사용할 열을 결정합니다.

pd.merge(df1, df2, left_on = '이름', right_on = '성명')
>>>
	이름	성적_x	성명	성적_y
0	영희	22	영희	40
1	영희	22	영희	63
2	철수	100	철수	88
3	철수	38	철수	88

4. 데이터 합성 인덱스를 기준으로 사용

하나) df1, df2 데이터 프레임 만들기

df1 = pd.DataFrame({
    '도시' : ('서울','서울', '서울', '부산', '부산'),
    '연도' : (2000, 2005, 2010, 2000, 2005),
    '데이터' : (9853972, 9762546, 9631482, 3655437, 3512547)})
df1
>>>
	도시	연도	데이터
0	서울	2000	9853972
1	서울	2005	9762546
2	서울	2010	9631482
3	부산	2000	3655437
4	부산	2005	3512547

df2 =pd.DataFrame(
    np.arange(12).reshape((6,2)),
    index = (('부산', '부산', '서울', '서울', '서울', '서울' ),
            (2000, 2005, 2000, 2005, 2010, 2015)),
    columns =('데이터1', '데이터2'))
df2
>>>
	데이터1	데이터2
부산	2000	0	1
      2005	2	3
서울	2000	4	5
      2005	6	7
      2010	8	9
      2015	10	11

2) 인덱스를 기본 열로 병합(right_index=True)

pd.merge(df1, df2,left_on=('도시','연도'),right_index=True)
>>>
	도시	연도	데이터	데이터1	데이터2
0	서울	2000	9853972	   4	5
1	서울	2005	9762546	   6	7
2	서울	2010	9631482	   8	9
3	부산	2000	3655437	   0	1
4	부산	2005	3512547	   2	3