파이썬 데이터 결합
SQL의 join과 유사. 공통 컬럼을 기준으로 테이블 병합.
주요옵션(파라미터)
1) 기본 코드
:df3의 Customer ID는 출력되지 않는다.merge_df = pd.merge(df2,df3, how='inner', on='Customer ID')2) 공통 컬럼이 2개 이상일 때
merge_df = pd.merge(df2, df3, how='inner', on=['공통컬럼1','공통컬럼2'])3) 기준열 이름이 다를 때
: df3의 Customer ID가 df2의 컬럼명과 겹쳐 컬럼명이 변경되서 나옴.merge_df = pd.merge(df2,df3, how='inner', left_on = 'Customer ID', right_on = 'user id')
4) 공통 컬럼을 개별로 출력하고 싶을 때
: 겹치는 컬럼명이 있으면 suffixes로 설정한 대로 출력됨.merge_df = pd.merge(df2,df3, how='inner', on='Customer ID', suffixes=('_left','_rihgt'))
인덱스 기준으로 테이블을 병합. 사용 거의 안함.
# join 방식 설정
df2.join(df3, how='right')
# join시 이름이 같은 컬럼이 있을 경우 반드시 문자열 지정해야함.
df.join(df2,how='left', lsuffix='1', rsuffix='2', sort=True)
여러 데이터프레임 or 시리즈를 특정 축을 따라 연결
ex)
# 가로로 결합 pd.concat([df2, df3], axis=1, ignore_index=True, join='inner')
axis = 1으로 했으면 가로로 결합이됨. 그렇기 때문에 ignore_index=True를 사용하면 세로축의 인덱스가 재정렬 되는 것이 아니라 가로 컬럼값이 숫자로 재정렬됨.
내가 원하는 컬럼들로 새로운 데이터프레임을 만들고 계산할 수 있음.
fill_value=0ex)
# age, Category 라는 축을 기준으로 성별 Previous Purchases 최소, 최대값 구하기 pd.pivot_table(df2, index=['Age','Category'],columns='Gender', values='Previous Purchases', aggfunc=['min','max'])
함수를 한번만 사용하거나 인자로 전달해야하는 경우에 사용함.
ex)
# lambda 함수를 이용한 홀수 출력하기 mylist = [1, 2, 3, 4, 5] mylist2 = list(filter(lambda x: x % 2 == 1, mylist)) print(mylist2) # lambda 함수를 이용한 정렬 mylist = ['apple', 'banana', 'cherry'] mylist2 = sorted(mylist, key=lambda x: len(x)) print(mylist2)
문자열 나눌때 사용함.
inline if
: 만족했을 때 결과값 if 조건 만족 못했을 때 결과값.for i in range(7): df2["명수{}".format(i)] = df2['x'].apply(lambda x: x.split('.')[i] if len(x.split('.'))>i else None)apply()가 df['x']의 행을 위에서부터 차례대로 내려가면서 lambda 함수를 적용함. 명수0, 명수1, ~ 명수6
dateutil 라이브러리에 속한 함수로 날짜 데이터를 원하는 기준에 따라 output으로 가져올 수 있음.
주요옵션
ex)
weekly_rule = rrule(DAILY, dtstart=start_date, until=end_date)
1) 내가 원하는 날짜를 만듬
# 2023-02-01 부터 2023-03-01 까지 strf 사용하여 원하는 데이터 형식으로 출력. from datetime import datetime from dateutil.rrule import rrule, DAILY # 시작 날짜, 종료날짜 start_date = datetime(2023, 2, 1) end_date = datetime(2023, 3, 1) daily_rule = rrule(DAILY, dtstart=start_date, until=end_date) # 빈 리스트 생성 후 날짜를 담아주기 a=[] for date in daily_rule: a.append(date.strftime('%Y-%m-%d'))a의 결과는 ['2023-02-01', '2023-02-02', ..., '2023-03-01']
2) 내가 보려고 하는 df3에서 날짜를 필터링
# df3 에 있는 날짜 데이터는 string # string -> datetime -> string 의 형태로 변환 # 위에서 받은 리스트에 해당하는 데이터만 필터링하기 위함 df3['Time stamp2'] = pd.to_datetime(df3['Time stamp'], format='%d/%m/%Y %H:%M').dt.strftime('%Y-%m-%d') mask =(df3['Time stamp2'].isin(a)) # a 날짜에 속하면 True 아니면 False 형태로 나옴.3) df3에 마스크를 씌움