판다는 귀여운데 판다스는
업데이트:
Pandas Study
데이터 분석에 기초가 되어줄 판다스 라이브러리 공부하기
- 데이터타입
- 시리즈
- 파이썬의 list, 넘파이의 array와 같은 1차원 배열
- 데이터프레임
- 2차원 배열
pd.Series([1,2,3,4]) pd.Series(np.random.randint(1,3,100))
- 2차원 배열
- 시리즈
- Series를 DataFrame으로!
s = s.to_Frame()
- csv불러올 때 구분자 설정, 인덱스 설정
- 길이가 정해지지 않은 공백으로 구분되어있으면, sep=’\s+’ 사용
- 날짜, 시간으로 된 데이터 parse_dates로 파싱하기
df = pd.read_csv('../aa/aa.csv', sep='\s+', index=1, parse_dates=[[0,1,2]]) #sep='\t', '\n' 등 #index='col3'
- 행(0) 혹은 열(1) 세기
df.shape[0] #[1]은 col
- info로 각 피처 별 레코드 수 및 null, 자료형 파악
df.info()
- 각 피처의 데이터 타입
df.dtypes
- groupby 가능! 거기에 sum(), mean() 등도 가능!
df1 = df.groupby('col1') df1 = df1.sum() c = chipo.groupby('choice_description').sum().sort_values(by='quantity', ascending=False)
- apply 로 함수 적용. lambda와 같은.
df['col1'] = df['col1'].apply(lambda x: float(x))
- 해당 col의 그룹화하여 개수 세기
df['col1'].value_counts() df['col1'].nunique()
- 모든 피처 describe()
df.describe(include='all') # default = only numeric col
- len으로 필터링한 레코드 개수 세기
len(df[df['col'] == 1]) # 10
- 특정 문자로 시작하는 레코드 조회
df[df['col'].str.startswith('A')]
- loc (location) 과 iloc
- 둘다 인덱스 조회, loc[row, col]으로 동일
- loc
- col을 이름으로 조회
- 수식 가능
- iloc
- col을 숫자로 조회
- loc은 문자 입력, iloc은 숫자로 조회 ```python # loc df.loc[:3, :[‘col’]] df.loc[df[‘col’].isin([‘a’,’c’]), [‘col1’, ‘col2’]]
# iloc df.iloc[:4, 1:3]
#같이도 됨 df.loc[[‘col’]].iloc[,3] ```
- 여러개의 값이 있는지 조회(or연산)
df.isin['a', 'b', 'c']
- and와 or필터링
df[df['col']>20][df['col1']=='d'] # and연산 df[(df['col']>20) | (df['col']<10)] # or연산
- 그룹화 후 여러 통계량 조회
df.groupby('col')['col2'].agg(['max', 'min', 'median'])
- 그룹화 후 agg와 딕셔너리를 활용하기!
gender_ocup = users.groupby(['occupation', 'gender']).agg({'gender': 'count'})
- groupby 연산 후 피벗처럼 보기
df.groupby(['col1', 'col2'])['col3'].mean().unstack()
- groupby 후 레코드 수 세기
df.groupby(['col1', 'col2']).size()
- groupby로 묶으면
- 그룹화한 (index, 나머지 값들) 로 저장됨.
for colname, group in df.groupby('col1'): print(colname) # colname출력 print(group) # 나머지 값들 출력
- 그룹화한 (index, 나머지 값들) 로 저장됨.
- applymap은 2차원 배열에 함수 적용할 때 씀
df.applymap(def)
- datetime으로 데이터 변환
df['col'] = pdf.to_datetime(df['col'], format='%Y')
- index 설정
- reset_index로 0부터 n-1까지의 숫자로 초기화시킬 수 있다.
df.set_index('col', inplace=True) df = df.set_index('col', drop=True) df.reset_index(drop=True, inplace=True)
- reset_index로 0부터 n-1까지의 숫자로 초기화시킬 수 있다.
- col 삭제
- 여러개 삭제는 df.drop(df.columns[[1,2,3], axis=1)
del df['col'] df = df.drop(df.columns[[1,2,3]], axis=1)
- 여러개 삭제는 df.drop(df.columns[[1,2,3], axis=1)
- 리샘플링
- 시간 간격을 재조정함
-
시간 인수 자세히 보기 (Offset aliases로 검색)
- 업샘플링(up-sampling)
- 시간 구간이 작아져서 데이터 개수가 증가
- 다운샘플링
- 시간 구간이 커지며 데이터 개수가 감소
- ex. 분단위를 시간단위로 바꾸는 것
- groupby를 한 것 처럼 그룹화되므로, 측정하려는 통계량 필요
- 날짜가 아닌 시/분 단위에서는 start ~ end 구간에서 start는 포함, end는 제외
- start 제외, end 포함하고 싶으면, closed=’right’ 써줌
ts.resample('col', closed='right').mean() # 다운샘플링
- 날짜인덱스의 장점
- 다운샘플링을 groupby로 할 수 있다는 점
- 다른 변수를 선언하지 않고 바로 볼 수 있음
data.groupby(data.index.to_period('A')).mean() # to_period('D') 등
- idxmin, idxmax
df.idxmin() # 최소값을 가지고 있는 index 반환 df.idxmax() # 최대값을 가지고 있는 index 반환
- df들 병합 가능
df = df1.append(df2)
- df concat
df = pd.concat([df1, df2], axis=0) # 이건 df1.append(df2)랑 같음
- df merge (DB쿼리와 매우 유사하다!)
pd.merge(df1, df2, on='key_col', how='outer')
- datetime.date(yy,mm,dd)로 선언한 col은 object형으로 저
- pd.to_datetime(‘col’)로 datetime62로 변환해줘야함.
df['col'] = pd.to_datetime(df['col'])
- pd.to_datetime(‘col’)로 datetime62로 변환해줘야함.
- 결측값
- 결측값 계산: isnull (<> notnull)
- 결측값 없애기: dropna()
df.isnull().sum() df.dropna()
- 다 합치기
df.sum().sum()
- 행단위로 계산하기
df['rawmin'] = df['col'].min(axis=1)
- index 가져오기
df.index.get_level_values(1)
- index is duplicated?
df.index.is_unique
- 인덱스 정렬
df.sort_index()
- timedelta를 day로 계산
- timedelta 객체 자세한 정보
timedelta.days
- timedelta 객체 자세한 정보
댓글남기기