본문 바로가기
서비스 기획/☁️ 데이터 분석 공부

[췻쉿] DataFrame으로 모든 데이터 모으는 방법

by 림뽀 2022. 12. 24.
반응형

Pandas DataFrame cheatsheet

데이터 분석을 한층 편리하게 해 줄 여러 가지 기능들

내가 아직 외우지 못한 기능을 한 번에 찾을 수 있게 모아놨다.

 

1) DataFrame을 합친 후 (merge 전/후) 중복 제거하기: df.drop_duplicates()

df.drop_duplicates(subset=['user_id','content_id','date'], 
			keep='first', inplace=True)

 

drop_duplicates

  • subset = [열1, 열2, ...]
    • 어떤 열을 기준으로 중복을 검사할 것인지 정하기. 여러 개 설정 가능.
    • 디폴트는 전체 열
  • keep = {‘first’, ‘last’, False}
    • 중복값이 있을 경우 어떤 값을 살릴 것인지
    • False = 중복값 모두 버림

merge 후 중복 제거 필요 이유

  • 합치는 기준이 되는 값이 여러 개일 수 있기 때문
  • 예를 들어, 테이블 A의 '이름' 열과 테이블 B의 '이름' 열을 기준으로 A, B를 합친다고 해보자. 테이블 A의 이름은 각 행 별로 distinct하게 존재하고, 테이블 B의 이름은 여러 행에 중복으로 존재한다. 이럴 때 A와 B를 합치면 B의 행 개수만큼 행이 만들어진다.

 

2) DataFrame을 정렬하고 싶을 때: df.sort_values()

df = df.sort_values(by=['user_id', 'client_timestamp'], 
			ascending=[True, False])

 

  • by = [열1, 열2, ...]
    • 어떤 열을 기준으로 정렬할 것인지 정하기. 여러 개 설정 가능하며, 행 기준으로도 정렬 가능.
  • ascending = [True, False]
    • 오름차순, 내림차순 정하기. 열 별로 규칙 설정 가능.

 

3) DataFrame에 특정 열을 끼워 넣고 싶을 때: df.insert()

df.insert(0,'start_date',recent_14_date)

 

  • insert(삽입할 index, 컬럼명, 데이터(시리즈 등))

 

4) 집계 안 하는 피벗 테이블을 만들고 싶을 때: df.pivot()

best_channels_pivot = df.pivot(index ='start_dt', 
			columns = 'rank', values = 'channel_name')

 

  • index = pivot table의 행 기준이 될 컬럼
  • columns = pivot table의 열 기준이 될 컬럼
  • values = pivot table의 값으로 넣을 컬럼
    • *참고: 집계 가능한 피벗 테이블을 만들고 싶으면 df.pivot_table(index = '', columns = '', values = '', aggfunc=np.sum)

 

5) series를 DataFrame으로 만들고 싶을 때: series.to_frame()

df.groupby('date')['user_id'].nunique().to_frame()

 

6) 문자로 된 날짜를 timestamp 형식의 날짜로 바꾸고 싶을 때: pd.to_datetime()

df['date_time'] = pd.to_datetime(df.date_text)

  • 문자 형식을 timestamp 형식으로 변환해야 정상적인 날짜 덧셈/뺄셈이 가능함
  • to_datetime을 이용하면 DataFrame, series의 값 전체의 형식을 변환할 수 있음

 

7) timestamp 날짜로부터 n일 후 날짜 구하기:  + timedelta(days=n)

df['date_time_30'] = (pd.to_datetime(df.date_text) + timedelta(days=30))

 

  • 날짜 혹은 시간 사이의 간격을 의미함 (days, seconds, minutes, hours, weeks 설정 가능)

 

 

DataFrame으로 모든 데이터 모으는 방법

to_csv로 dataframe을 csv 파일로 추출하기 전에

집계된 모든 데이터를 하나의 dataframe으로 모으는 방법을 정리했다.

 

행 추가 1) df.loc[len(df)] = [값1, 값2, ... , 값n]

  • len(df) = 행 개수로, df.loc[len(df)] = 값을 추가할 때마다 len(df) 값이 1씩 증가됨
df = pd.DataFrame(columns=['dt','sum_duration','avg_duration'])
for d in sorted(df.dt.unique()):
    df.loc[len(df)]=[d, round(df['duration'].sum(),2), 
                        round(df['duration'].mean(),2)]

 

행 추가 2) pd.concat([df1, df2, ... , dfn], axis=0)

  • axis=0 위 + 아래로 합치기 (행으로 붙이기)
all_df = pd.concat([df, df_m1, df_m2, df_m3, df_m4])

 

열 추가 1) pd.concat([df1, df2, ... , dfn], axis=1)

  • axis=1 왼쪽 + 오른쪽으로 합치기 (열로 붙이기)
#Series concat
age_12 = user_demo.groupby('age').user_id.count()
age_11 = user_demo_m1_df.groupby('age').user_id.count()
age_10 = user_demo_m2_df.groupby('age').user_id.count()
age_9 = user_demo_m3_df.groupby('age').user_id.count()
age_8 = user_demo_m4_df.groupby('age').user_id.count()

age_df = pd.concat([age_8,age_9,age_10,age_11,age_12],axis=1)
age_df.columns = ['age_8','age_9','age_10','age_11','age_12']

 

열 추가 2) df['열이름'] = 값

df = pd.DataFrame()
df['access_users'] = access_df.groupby('dt').user_id.nunique()
df['sum_duration'] = play_df.groupby('dt').sum_duration.sum()
df['avg_duration'] = round(play_df.groupby('dt').sum_duration.mean(),2)

 

 

반응형

댓글