파이썬 머신러닝 완벽 가이드 - 2. Pandas

Mios·2022년 9월 26일
1

🗂 Pandas 판다스

1. 데이터 읽기 및 확인

  • read_csv() : ,, read_table() : \t, read_fwf() : 고정길이 파일
  • value_counts(): 해당 칼럼 값의 유형과 건수 확인 (Series 객체에만 정의)
  • describe() : agg류 연산 보여줌

2. 데이터 변환

2.1. list, ndarray, dictionary를 DataFrame으로 변환하기

  • 2차원 이하의 데이터들만 변환 가능
  • 생성인자로 list, ndarray, dictionary 입력
    • list, ndarray는 컬러명 지정해줘야 함 ⇒ 안해줘도 defalut로 만들어지긴 함

2.2. DataFrame ⇒ list, ndarray, dictionary 로 변환하기

  • list 로 변환하기
    • values()로 얻은 ndarray에 또 다시 tolist() 호출
    • DataFrame → ndarray → list 과정
  • ndarray로 변환하기
    • values()
    • 머신러닝 패키지의 입력인자로 적용하기 위해 다시 ndarray로 변환하는 경우 빈번
  • dictionary 로 변환하기
    • DataFrame 객체에 to_dict() 호출 ⇒ dict의 value 값이 또다시 idx:val인 이중 dict으로 나옴
    • to_dict(’list’)로 호출하면 ⇒ dict의 value 값이 리스트( [] )로 나옴

3. 데이터 수정, 인덱싱, 정렬, groupby()

3.1. 데이터 삭제

  • drop('삭제할 칼럼명', axis=0, inplace=False)
    • 삭제할 축 설정: axis=0은 row, axis=1은 column
    • inplace: False는 자기 자신의 데이터를 삭제하지 않고, 삭제된 결과를 반환. True는 자기 자신의 데이터를 삭제하고 None을 반환
    • axis = 0 으로 row drop : df.drop([0,1,2], axis=0)

3.2 Index 객체

  • df.index: index 추출
    • print(type(indexes)) print(type(indexes.values)) print(indexes.values.shape) print(indexes[:5].values) print(indexes.values[:5]) print(indexes[6])
      >>> <class 'pandas.core.indexes.range.RangeIndex'>
      <class 'numpy.ndarray'>
      (891,)
      [0 1 2 3 4][0 1 2 3 4]
      6
    • indexes[0] = 5 : error ⇒ 한번 만들어진 Index 객체는 함부로 변경할 수 없음
    • Series 객체는 Index 객체를 포함하지만, 연산 함수를 적용할 때는 Index는 연산에서 제외되고, Index 객체는 오직 식별용으로만 사용 됨
  • reset_index()
    • 새로운 연속 숫자형 인덱스 생성. 기존 인덱스는 index 칼럼명으로 추가됨
    • drop=True로 설정하면 기존 인덱스는 추가되지 않고 삭제됨
    • Series에 rest_index() 를 적용하면, Series가 아닌, DataFrame으로 반환됨 ⇒ 기존 인덱스가 칼럼으로 추가 되어, 칼럼이 2개가 됨
      • drop=True로 하면 기존 인덱스 칼럼이 날아가서, Series로 반환 됨
    • df.index = df.index+1 으로 새로운 index값 생성해서, index 재할당이 가능

3.3. 데이터 셀렉션 및 필터링

3.3.1. [ ] 연산자 ⇒ 단일 컬럼 데이터 추출 : df['col'], 여러 컬럼 데이터 추출 : df[['col_1', ‘col_2’]]

  • 안에 숫자 index는 KeyError 오류 발생 ⇒ df[0]
  • 단, 숫자 index가 pandas default index 형태면 가능 ⇒ df[0:2]

3.3.2. column [명칭] 기반 인덱싱과 column [위치] 기반 인덱싱의 구분

3.3.2.1. column [명칭] 기반 인덱싱 : df.loc[시작점:종료점] ⇒ 여기서 인덱싱 시작점과 종료점 모두 (-1 없이) 다 포함(명칭 기반이기에)

  • loc[]: 명칭 기반 인덱싱으로 행은 index값, 열은 column명 입력
    • df.loc['one', 'Year']
  • indexpandas default index 형태면 df.loc[ ]에 숫자형을 줘도 됨
    • df.loc[1, 'Year']
    • 이때, index=0은 없음 ⇒ (0, 0)의 빈자리임
  • loc['A':'Z', 'Name'] : 명칭의 슬라이싱도 가능
  • 궁극적으로 아래의 세 가지가 모두 가능 ⇒ index가 default여서 숫자가 가능한거고, 명칭으로도 가능
    • df.loc[1:2, 'Name' : 'Year']
    • df.loc[1:2, ['Name', 'Year']]
    • df.loc[[1,2], ['Name', 'Year']]

3.3.2.2. column [위치] 기반 인덱싱 : df.iloc[행, 렬] ⇒ 여기서는 일반적인 슬라이싱 처럼 (시작, 종료) ⇒ (시작, 종료-1)

  • iloc[ 0, 1:3] : 처럼 슬라이싱도 가능
    • iloc[]: 위치 기반 인덱싱으로 index, column 의 위치를 입력
      • df.iloc[0,1] 만약 df.iloc['A', 0] or df.iloc[0, 'A'] 등 명칭을 입력하면 error

3.3.3. 불린 인덱싱 , 예시) (row조건) ‘Age’가 60 초과인 row에서, (컬럼) ‘Name’ 과 ‘Age’ 인덱싱

  • titanic_df[titanic_df[’Age’] > 60][['Name', 'Age']] : “인덱싱df[조건(에맞는row)][칼럼명]
  • titanic_df.loc[titanic_df['Age'] > 60.0 , ['Name','Age']] : “명칭 locdf.loc[조건(에 맞는row)[칼럼명]
  • 불린 인덱싱 종류 ( and & , or | , not ~ )
    • titanic_df[ (titanic_df['Age'] > 60) & (titanic_df['Pclass']==1) & (titanic_df['Sex']=='female') ] : 불린으로 row 조건걸기
      • titanic_df[ (titanic_df['Age'] > 60) & (titanic_df['Pclass']==1) & (titanic_df['Sex']=='female') ] ['Name'] : col 명 인덱싱
    • titanic_df.loc[ (titanic_df['Age'] > 60) & (titanic_df['Pclass']==1) & (titanic_df['Sex']=='female') ] : loc로 row에 조건걸기
      • titanic_df.loc[ (titanic_df['Age'] > 60) & (titanic_df['Pclass']==1) & (titanic_df['Sex']=='female') ] ['Name] : col 명 인덱싱
    • 조건을 할당해서 적용할 수도 있음
      • cond1 = titanic_df['Age'] > 60 cond2 = titanic_df['Pclass']==1 cond3 = titanic_df['Sex']=='female' titanic_df[ cond1 & cond2 & cond3]
  • 자주 쓸 것을 요점정리 하자면
    • df.loc[조건 , [cols]]
    • df[조건][[cols]]

3.3.4. 정렬, Aggregation함수, GroupBy 적용

  • DataFrame, Series의 정렬 ⇒ sort_values()
    • sort_values(by=['칼럼명'], ascending=True, inplace=False)
  • DataFrame에서 Aggregation 호출하면 ⇒ 모든 칼럼에 해당 aggregation이 적용됨
    • df.count()
    • df[['Age', 'Fare']].mean()
    • df['Age'].mean() : Series에 mean 적용
  • GroupBy + Agg 호출하면 ⇒ groupby( ) 대상 칼럼 제외한 모든 칼럼에 해당 agg 함수 적용됨
    • titanic_df.groupby(by='Pclass') : 타입은 DataFrameGroupBy로 객체만 반환
    • titanic_df.groupby('Pclass')['Age'].count() : 이 객체에 다음과 같이 agg 함수를 적용해야함
      • 단독으로 위의 예시처럼도 사용 가능하고
      • titanic_df.groupby('Pclass')['Age'].agg([max, min]) : agg를 호출해서 여러개 적용도 가능
  • 서로 다른 column에, 서로 다른 agg 함수 넣기 ← dict으로 지정해서 넣어야 함
    : groupby에서 호출하려면 SQL에 비해 조금 복잡함
    - SQL ⇒ Select max(Age), sum(SibSP), avg(Fare) From titanic_table group by Pclass
    - Pandas ⇒ agg_format={'Age':'max', 'SibSp':'sum', 'Fare':'mean'} titanic_df.groupby('Pclass').agg(agg_format)
    OR
    titanic_df.groupby('Pclass').agg({'Age':'max', 'SibSp':'sum', 'Fare':'mean'})

4. 결손 데이터 처리

  • isna(): NaN 결손 데이터 여부 확인 (boolean)
    • isna().sum() : 각 col별로 결손 데이터 확인하기
  • fillna('대체할 값'): NaN 값을 대체하여 Missing 데이터 처리
    • titanic_df['Age'] = titanic_df['Age'].fillna(titanic_df['Age'].mean()) titanic_df['Embarked'] = titanic_df['Embarked'].fillna('S') titanic_df.isna().sum()
  • apply(lambda x: 식) : apply lambda식으로 데이터 가공
    • pandas에서 lambda를 쓰려면 .apply() 를 써야함
      • titanic_df['Name_len']= titanic_df['Name'].apply(lambda x : len(x))
    • lambda에서 if else 조건식 쓰기
      • titanic_df['Child_Adult'] = titanic_df['Age'].apply(lambda x : 'Child' if x <=15 else 'Adult' )
    • lambda에서 if else (if else) 이중 쓰기
      • titanic_df['Age_cat'] = titanic_df['Age'].apply(lambda x : 'Child' if x<=15 else ('Adult' if x <= 60 else 'Elderly'))
    • 너무 많으면 그냥 함수를 따로 만들어라

99. DataFrame 크기 조정

  • pd.options.display.max_rows = None : 전체 보기, None 대신 숫자 지정
  • pd.options.display.max_columns = None : 전체 보기, None 대신 숫자 지정
profile
mios의 데이터 놀이터 | Instagram@data.decision (하단 홈 아이콘 버튼)

0개의 댓글