반응형
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)
반응형
'서비스 기획 > ☁️ 데이터 분석 공부' 카테고리의 다른 글
[췻쉿] query, assign, type, 문자열, print (0) | 2023.02.26 |
---|---|
미국 데이터 분석 석사 선수과목 채우기 (2) | 2022.12.27 |
주니어 PM의 데이터 분석 학습기 (0) | 2022.08.31 |
인당 1일 평균 영상 시청 시간 구하기 (Python) (0) | 2022.08.26 |
영등위 API에서 등급정보 자동으로 불러오기 (0) | 2022.07.30 |
댓글