[TIL] python #4


データプリプロセッシング


カラム名とインデックス名の変更

df1 = pd.read_csv('data/grade.csv', encoding = 'euc-kr')
#전체 변경
#원본 데이터 프레임의 컬럼과 이름과 인덱스를 변경
#원본을 유지하고 싶다면 ... 데이터 프레임을 복제(copy)

df2 = df1.copy()

df2.columns = ['값1', '값2', '값3', '값4', '값5', '값6', '값7']
df2.index = ['사람1', '사람2', '사람3', '사람4', '사람5']
#데이터 일부만 변경
df3 = pd.read_csv('data/grade.csv', encoding = 'euc-kr')

a1 = { 
'국어' : 'kor',
'영어' : 'eng'
}

a2 = {
1 : '값2',
2 : '값3'
}

#inplace : True가 설정되면 원본 자체를 변경. 기본값은 False
df4 = df3.rename(columns=a1, index=a2)
df3.rename(columns=a1, index=a2, inplace=True)

特定のカラムを指定し、インデックスに設定します。

  • で指定されたカラムはインデックスとして設定され、データフレームから削除される.
  • df1 = pd.read_csv('data/grade.csv', encoding='euc-kr')
    
    df1.set_index('이름', inplace=True)

    データの取得

    df1 = pd.read_csv('data/grade.csv', encoding='euc-kr')
    df1.set_index('이름', inplace=True)
    df1[[True, False, True, False, True]]
    #True, False 가 들어가면 행을 가져오게 된다.
    
    a1 = df1[df1['국어'] > 90]
    #query: 데이터 프레임에서 조건을 만족하는 행만 가져와라.
    
    a2 = df1.query('국어 > 90')
    a3 = df1.query('국어 > 80 and 국어 < 100')
    a4 = df1.query('국어 < 80 or 국어 > 100')

    追加、削除

    df1 = pd.read_csv('data/grade.csv', encoding='euc-kr')
    df1.set_index('이름', inplace=True)
    #특정 값 하나를 변경한다
    
    #철수 행의 국어 열의 값을 2000으로 변경한다.
    df1.loc['철수', '국어'] = 2000
    
    #세번째 열, 네번째 컬럼의 값을 3000으로 변경한다.
    df1.iloc[2, 3] = 3000
    
    #일부를 발췌한다
    a3 = df1.loc['영희' : '수현', '국어' : '수학']
    
    #두번째 ~ 네번째 행, 두번째 ~ 네번째 열
    a4 = df1.iloc[1:4, 1:4]

    追加

    #없는 이름을 쓰면 추가가 된다
    
    #행추가
    df1.loc['길동'] = [5, '여자', 50, 51, 52, 53]
    
    #열추가
    df1['한국사'] = [50, 51, 52, 53, 54, 55]
    #열을 추가할 때는 모든 컬럼의 값이 다 들어가 있어야한다.

    削除

  • axis:操作基準軸(0:水平軸、1:垂直軸)
  • を設定
    #행삭제
    df1.drop('길동', inplace=True)
    
    #열삭제
    df1.drop('한국사', inplace=True)
    # ↑ 한국사라는 행을 삭제하는 명령어라서 에러남
    
    #axis : 삭제대상 (0: 행삭제, 1:열삭제)
    df1.drop('한국사', inplace=True, axis = 1)

    データフレームのマージ

    df1 = pd.read_csv('data/grade.csv', encoding='euc-kr')
    df2 = df1[['이름', '학년', '성별']]
    df3 = df1[['이름', '국어', '영어']]
    
    df3 = df3.reindex(index=[4, 0, 3, 1, 2]
    df3.index = [0, 1, 2, 3, 4
    #concat은 인덱스가 같은 것 끼리 합쳐진다.
    df10 = pd.concat([df2, df3], axis = 1)
    #axis = 1 -> 세로 방향으로 합친다. 가로 방향으로 합친다. 합치는 방향이 세로라는 의미
    #merge : 두 데이터 프레임의 컬럼을 지정한다. 지정된 컬럼의 값이 같은 것끼리 합쳐진다
    #left_on : 좌측 데이터프레임의 컬럼 이름, right_on : 우측 데이터 프레임의 컬럼 이름
    df20 = pd.merge([df2, df3, left_on='이름', right_on='이름')

    異常値欠落測定値処理


    実測値

  • 空き地
  • 文字列:NA、数字列:NAN
  • クリア、2つの代替方法があります
  • クリア:クリア値のあるスクライブをクリアします.データは改ざんされませんが、学習量は減少します.
  • 代替:得られた値に客観的に基づいて埋め込まれる.学習量は変わらないが、データは改ざんされる.
  • import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    df1 = pd.read_csv('data/grade.csv', encoding='euc-kr')
    
    #결측치를 확인한다.
    df1.isna().sum()
    
    #결측치가 있는 로우를 제거한다.
    df2 = df1.copy()
    df2.dropna(inplca=True)
    
    #결측치가 있는 컬럼을 제거한다.
    df3 = df1.copy()
    df3.dropna(inplace=True, axis=1)
    
    #결측치 존재 여부를 검사할 컬럼을 지정하여 삭제한다.
    df4 = df1.copy()
    df4.dropna(inplac=True, subset=['수학', '과학'])
    
    #결측치 존재 여부를 검사할 인덱스를 지정하여 삭제한다.
    df5 = df1.copy()
    df5.dropna(inplace=True, subset=[2,3,4], axis=1)
    
    #모든 컬럼의 데이터가 결측치로 되어 있는 로우만 골라 제거한다.
    df6 = df1.copy()
    df6.loc[5] = [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]
    
    df6.dropna(inplace=True, how='all')
    
    #결측치 부분을 특정값으로 셋팅해준다.
    
    #모든 컬럼, 모든 행의 결측치를 동일한 값으로 채워준다.
    df7 = df1.copy()
    df7.fillna(value=50, inplace=True)
    
    #각 컬럼별로 결측에 채워줄 값을 지정한다.
    df8 = df1.copy()
    df8['영어'].fillna(value=1000, inplace=True)
    df8['수학'].fillna(value=2000, inplace=True)
    df8['과학'].fillna(value=3000, inplace=True)

    例外値

  • 論理美:社会観念の中で規定範囲を超えた値または非規定ラベルの値
  • 統計的意義:極端大または極小値は異常値(極端値)
  • と疑うべきである.
  • の極端値に基づく:標準偏差が3以上-3未満の値
  • df1 = pd.read_csv('data/grade.csv', encoding='euc-kr')
    
    #이상치 확인 - 범위형 데이터
    df1[['국어', '영어', '수학', '과학']].describe()
    
    #이상치 확인 - 레이블 데이터
    display(df1['이름'].value_counts().index)
    display(df1['학년'].value_counts().index)
    display(df1['성별'].value_counts().index)
    
    #이상치 확인 - 극단치 존재 여부 확인
    #파란 네모 : 데부분의 데이터가 모여 있는 곳
    #초록색 선 : 평균의 위치
    #검은 선 : 통계적으로 봤을 때 정상 범위라고 생각되는 부분
    #동그라미 : 극단치
    df1[['국어', '영어', '수학', '과학']].boxplot()
    plt.show
    #폰트 설정
    plt.rcParams['font.family'] = 'Malgun Gothic'
    #plt.rcParams['font.family'] = 'AppleGothic'
    
    #그래프 크기 설정
    plt.rcParams['figure.figsize'] = (20, 10)
    
    #글자 설정
    plt.rcParams['font.size']=16
    #이상치를 가지고 있는 데이터를 추출한다. (90보다 크면 이상치라고 가정한다.)
    df1 = pd.read_csv('data/grade.csv', encoding='euc-kr')
    df1.set_index('이름', inplace=True)
    
    a1 = df1.query('국어 > 90').index
    df1.drop(a1, inplace=True)
    
    #이상치 대체
    df1 = pd.read_csv('data/grade.csv', encoding='euc-kr')
    df1.set_index('이름', inplace=True)
    
    a1 = df1.query('국어 > 90').index
    df4.loc[a1, '국어'] = 0

    DataFrameの可視化


    Python用の代表的なビジュアル化ライブラリ

  • matplotlib:使用頻度が最も高く、非常に多くのグラフをサポートしています.https://matplotlib.org/
  • seaborn:matplotlibは、サポートされていないグラフィックをサポートします.https://seaborn.pydata.org/
  • パンダ内部でmatplotlibを用いて図形を描くコードが実現された.https://pandas.pydata.org/ https://pandas.pydata.org/docs/user_guide/index.html#user-guide