DataFrame 합성
Pandas는 두개 이상의 DataFrame을 하나로 합치는 데이터 병합(merge)이나 연결(concatenate)을 지원합니다.
DataFrame merge()
merge 함수는 두 데이터프레임의 공통 column 혹은 인덱스를 기준으로 두개의 테이블을 합친다.
이 때 기준이 되는 column, row의 데이터를 키(key)(PK)라고 합니다.
df1 = pd.DataFrame({
'고객번호': [1001, 1002, 1003, 1004, 1005, 1006, 1007],
'이름': ['둘리', '도우너', '또치', '길동', '희동', '마이콜', '영희']
}, columns=['고객번호', '이름'])
df2 = pd.DataFrame({
'고객번호': [1001, 1001, 1005, 1006, 1008, 1001],
'금액': [10000, 20000, 15000, 5000, 100000, 30000]
}, columns=['고객번호', '금액'])
merge 함수로 두 데이터 프레임 df1, df2를 합치면 공통 column인 고객번호 column을 기준으로 데이터를 찾아서 합친다.
이 때 기본적으로 양쪽 DataFrame에 모두 키가 존재하는 데이터만 보여주는 inner join 방식을 사용합니다.
pd.merge(df1, df2)
outer join 방식은 키 값이 한 쪽에만 있어도 데이터를 보여줍니다.
pd.merge(df1, df2, how = 'outer')
left는 첫번째 인수 기준으로, right는 두번째 인수 기준으로 DataFrame의 키 값을 모두 보여줍니다.
pd.merge(df1, df2, how = 'left')
pd.merge(df1, df2, how = 'right')
DataFrame 시계열자료 다루기
시계열 자료는 인덱스가 날짜 혹은 시간인 데이터를 말합니다. pandas 에서 시계열 자료를 생성하려면 인덱스를
DataTime 인덱스 자료형으로 만들어야합니다.
# pd.to_datetime
date_str = ["2018, 1, 1", "2018, 1, 4", "2018, 1, 5", "2018, 1,6"]
idx = pd.to_datetime(date_str)
idx
pd.date_range 함수를 쓰면 모든 날짜/시간을 일일이 입력할 필요없이 시작일과 종료일 또는 시작일과 기간을 입력하면 범위 내의 인덱스를 생성해줍니다.
pd.date_range(start = "2018-4-1", periods = 30)
freq 인수로 특정할 날짜만 생성되도록 할 수 있습니다. 많이 사용되는 freq 인수 값은 다음과 같습니다.
- s: 초
- T: 분
- H: 시간
- D: 일(day)
- B: 주말이 아닌 평일
- W: 주(일요일)
- W-MON: 주(월요일)
- M: 각 달(month)의 마지막 날
- MS: 각 달의 첫날
- BM: 주말이 아닌 평일 중에서 각 달의 마지막 날
- BMS: 주말이 아닌 평일 중에서 각 달의 첫날
- WOM-2THU: 각 달의 두번째 목요일
- Q-JAN: 각 분기의 첫달의 마지막 날
- Q-DEC: 각 분기의 마지막 달의 마지막 날
pd.date_range("2018-4-1", "2018-4-30", freq = "B")
시계열 데이터의 인덱스는 시간이나 날짜를 나타내기 때문에 날짜 이동 등에 다양한 연산이 가능합ㅎ니다. 예를 들어 shift 연산을 사용하면 인덱스는 그대로 두고 데이터만 이동할 수 있습니다.
pd.date_range(start = "2018-4-1", periods = 30)
ts.shift(-1)
ts.shift(1, freq = "M")
ts.shift(1, freq = 'W')
datetime 자료형 Series에는 dt 접근자가 있어 datetime 자료형이 가진 몇가지 유용한 속성과 메서드를 사용할 수 있습니다.
예를 들어 year, month, day, weekday 등의 속성을 이용하면 년, 월, 일, 요일 정보를 빼낼 수 있습니다.
s.dt.year
s.dt.weekday
strftime 메서드를 이용하여 문자열을 만드는 것도 가능합니다.
s.dt.strftime("%Y년 %m월 %D일")
DataFrame 그룹 연산 메서드
예를 들어 다음과 같은 데이터가 있을 때 key1의 값(A 또는 B)에 따른 data1의 합계는?
groupby 명령을 사용하여 그룹A와 그룹B로 구분한 그룹 데이터를 만든다.
groups = df2.groupby(df2.key1)
groups
이 GroupBy 클래스 객체에는 각 그룹 데이터의 인덱스를 저장한 groups 속성이 있습니다.
groups.groups
예를 들어 다음과 같은 데이터가 있을 때 key1의 값(A 또는 B)에 따른 data1 의 합계는 어떻게 구할까?
np.random.seed(0)
df2 = pd.DataFrame({
'key1': ['A', 'A', 'B', 'B', 'A'],
'key2': ['one', 'two', 'one', 'two', 'one'],
'data1': [1, 2, 3, 4, 5],
'data2': [10, 20, 30, 40, 50]
})
df2
A그룹과 B그룹 데이터의 합계를 구하기 위해 sum이라는 그룹 연산을 합니다.
groups.sum()
groupby 명령을 사용하여 그룹A와 그룹B로 나뉠 수 있습니다.
데이터를 그룹으로 나눈 Groupby 클래스 객체 또는 그룹 분석한 결과에서 data1만 뽑아도됩니다.
df2.groupby(df2.key1)['data1'].sum()
df2.groupby(df2.key1).sum()['data1']
이번에는 복합 키(key1, key2) 값에 따른 data1의 합계를 구하자. 분석하고자 하는 키가 복수이면 리스트를 사용합니다.
df2.data1.groupby([df2.key1, df2.key2]).sum()
그룹 분석 기능을 사용하면 위의 인구 데이터로부터 지역별 합계를 구할 수 도 있습니다.
df1['인구'].groupby([df1['지역'], df1['연도']]).sum().unstack('연도')
'데이터 분석 및 시각화 > 파이썬' 카테고리의 다른 글
[Python]Pandas 특정 문자열 포함 행 찾고 대체하기(str.contains, where) (0) | 2023.01.30 |
---|---|
[Python] Pandas 시리즈 문자열 변경 메소드(replace) (1) | 2023.01.30 |
[Python] 기초 정리(Pandas_DataFrame3) (0) | 2023.01.20 |
[Python] 기초 정리(Pandas_DataFrame2) (2) | 2023.01.19 |
[Python] 클래스 연습문제 (1) | 2023.01.18 |