코딩 개발자의 하루/Python Data Science

[데이터 분석 기초] Series, DataFrame, Groupby

소자해커 2023. 9. 6. 17:34

[Pandas]

- 데이터 분석을 위한 라이브러리

 

[Series]

- dict 형태의 pandas 라이브러리. 1차원 배열을 나타냄.

- Series(data, index) : Series 데이터 타입 생성 (index 활용 가능)

- s.loc[ 'index' ] / s.iloc[ 0:3 ] : Series 인덱싱/ 슬라이싱

- s.iloc[ [0, 2] ] : 불연속적인 index에 해당하는 값 추출도 가능하다.

- s.loc['index'] = value : 새로운 딕셔너리 값 추가 (dict['key'] = value 와 유사한 형태)

- s.drop['index'] : 데이터 삭제

=======================

- broadcasting : 시리즈간 연산을 지원한다.

- Series( [10, 20, 30], index=['가', '나', '다'] ) + Series( [20, 30, 40], index = ['나','가','다'] )

: 같은 인덱스끼리 연산한다. 인덱스가 다르면 연산하지 않는다.

- Series.loc[ Series < 1000 ] : 연산자를 통해 True의 값만 불러온다.

- Series.loc[ Series < 1000].index : 인덱스만 추출.

- Series.loc[ Series < 1000].values : 값만 추출.

=======================

- Series([], dtype='category') : 사용 메모리를 효율적으로 줄여준다.

- s.memory_usage() : 사용 메모리를 나타낸다.

- s.info() : series의 정보를 돌려준다 (메모리 사용량..)

- s.to_datetime('날짜') : timestamp 값을 반환한다.

print(ts.year)
print(ts.week)
print(ts.month)
print(ts.day)

- s.astype('int') : 기존 object type에서 int type으로 변환

- s.replace(',','',regex=True) : 데이터 치환 (완벽히 동일한 문자/숫자만 찾아서 변환)

- s.str.replace(",","") : 문자열만 찾아서 변환

- s.str[0:3] : 문자열 인덱싱

- s.map(함수명) : 시리즈 데이터타입에서 함수를 호출해서 사용할 수 있다. (단, 이때 함수명을 map 함수를 활용해 호출한다. 그리고 return 값이 시리즈 값이 반복적으로 들어간다.)

 

[매서드]

- s.sort_values() : 오름차순으로 정렬

- s.sort_values(ascending=False) : 내림차순으로 정렬

- s.sort_index(ascending=False) : 내림차순으로 인덱스 값 정렬

- s.rank() : 값의 크기 순서를 매기는 매서드

- s.value_counts() : 값의 개수를 출력해준다.

 

[판다스 데이터프레임]

- 2차원 리스트 형태의 배열을 가진다.

- 딕셔너리, 리스트 형태로 저장 가능.

- df = DataFrame(리스트, columns= ['시가', '고가', '저가', '종가']) : Column 명 설정이 가능하다.

- df.mean(axis = 1) : 2차원 배열 평균 연산 (if axis == 1: row index)

- df.head(1)/tail(1) : 데이터 량이 방대할 때, 몇개의 데이터만 보고 싶은 경우 활용. (default = 5)

- df.fillna() : 결측값에 대해 판다스는 Nan로 출력하지만, 특정 값으로 대체하고 싶을 때 활용.

- df.isna() : 결측값 존재유무에 대해 boolean으로 알려준다.

- df['등록일자'].astype('string') : 형변환

 

[데이터프레임과 인덱싱]

- row: 행, column: 열

- df.iloc[0] : row data를 불러들일 때 사용한다.

- df.loc['index'] : column data를 불러들일 때 사용한다.

- df.loc[ df['column'] > 100 ] : 조건에 해당하는 index 값에 해당되는 row 출력

- df.loc['index'].loc['column'] : index 통해 row 추출하고 다시 column 추출

- df['column'].loc['index'] : column 추출하고 다시 row 추출

 

[adv. 인덱싱]

- 이중 indexing을 위한 방법

- df.loc[행, 열] 

- df.iloc[열 숫자, 행 숫자] : iloc는 숫자로 데이터에 접근하기 때문에 행, 열 정보를 숫자로 지정해야 합니다.

 

[adv. 슬라이싱]

- df.loc[ ['20200615','20200618'], ['고가', '종가']] : 리스트 값을 넣어서 2차원 배열의 슬라이싱을 구현.

- df.iloc[ [0, -1], [1, -1]] : iloc는 숫자로 데이터에 접근하기 때문에 행,열 정보를 숫자로 지정해야 합니다.

 

[데이터프레임 생성/삭제]

- res = df.drop( '20200619' ) : 해당 row 삭제

- res = df.drop('저가',axis = 1): 해당 column 삭제

- df.loc['20200619'] = [20, 20, 20, 20] : 해당 row 추가

 

[인덱스 및 칼럼 설정하기]

- df.reset_index() : 인덱스 초기화 및 새로운 index 이름의 column 생성.

- res = df.set_index('종가') : column 이름으로 index 설정.

- df.index.name = '일자' : index name 설정.

- df.columns.name = 'b' : column name 설정.

- df = pd.concat([df1, df2], axis=1) : 두 df를 붙이는 매서드.

- pd.merge(df1, df2, on="구분") : 두 df를 중복되는 값만 붙이는 매서드. (on에 해당되는 값을 기준으로 중복될 때만 값 머지함.)

 

[데이터 프레임 그룹화]

- split: 특정 컬럼을 기준으로 같은 값을 같는 데이터로 분할한다. 

- apply: 분할된 각각의 데이터에 min/max .. 적용한다.

- combine : 

- groupby : split/apply/combine 세개를 복합적으로 수행해주는 명령어

 

- df['sex'].unique() : 'sex' 칼럼에 해당되는 값을 한개씩만 출력해준다.

df['호선명'].unique()
set( df['호선명'].values )

 

 

- `groupby` 메서드를 사용하면 특정 컬럼을 기준으로 데이터를 분류할 수 있습니다. 

- gb.get_group('m') : groupby를 통해 테이블이 잘 나뉘었는지 알아볼 수 있다.

 

-`DataFrameGroupBy` 객체의 `agg` (aggregation) 메서드를 사용해서 같은 기능을 구현할 수 있습니다. `agg` 메서드는 분리된 데이터프레임을 처리할 함수를 입력받습니다. 이 때 함수는 하나의 파라미터를 입력받아 하나의 값을 `return` 해야 합니다.

 

- df.groupby('sex').agg(proc)

gb1 = df[['사용일자', '승차총승객수']]
gb1.set_index('사용일자')
gb1.groupby('사용일자').sum()

--- Example ---
how = { '승차총승객수': 'sum' }
df.groupby('사용일자').agg(how)


def proc(x):
    return x.sum()

df[['사용일자','승차총승객수']].groupby('사용일자').agg( proc )