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
– 필나 방식 – astype 방법 |
데이터 프레임 인덱스 조작 – 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