[データ解析]7.Pandas


1.データフレーム

  • パンダスの基本構造
  • import pandas as pd
    index = pd.date_range('1/1/2000', periods=8)
    print(index)
    #DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04', '2000-01-05', '2000-01-06', '2000-01-07', '2000-01-08'], dtype='datetime64[ns]', freq='D')
    
  • 日付形式で8個のインデックスを作成
  • import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(np.random.rand(8,3), index=index, columns=list('ABC'))
    df
  • 8行3列からなる行列を生成
  • index選択なしで自動選択
  • 特定行/列選択時系列データ構造で表示
  • print(df['B'])
  • シリーズ形式で表示
  • print(df['B'] > 0.4)
  • 適用マスク
  • import pandas as pd
    import numpy as np
    
    index = pd.date_range('1/1/2000', periods=8)
    df = pd.DataFrame(np.random.rand(8,3), index=index, columns=list('ABC'))
    df2 = df[df['B']>0.4]
    df2
    df2.T #데이터 프레임 뒤집기
  • データフレーム行と列置換:T(転置)
  • -2 D配列複写


    🌼 行優先計算vs列優先計算
  • 行優先計算に基づく
  • 熱方向軸計算:axis=1
  • 1)行方向軸の計算

    import pandas as pd
    import numpy as np
    
    index = pd.date_range('1/1/2000', periods=8)
    df = pd.DataFrame(np.random.rand(8,3), index=index, columns=list('ABC'))
    df['D'] = df['A'] / df['B']
    df

    2)列方向軸の計算

    import pandas as pd
    import numpy as np
    
    index = pd.date_range('1/1/2000', periods=8)
    df = pd.DataFrame(np.random.rand(8,3), index=index, columns=list('ABC'))
    df['D'] = df['A'] / df['B']
    df['E'] = np.sum(df, axis=1)
    df.head()
  • df['E'] = np.sum(df, axis=1):行為基準を合計してEという列を生成
  • df.head():上位5行のみ出力
  • 2-1)すべてのデータを優先的に計算する列

    import pandas as pd
    import numpy as np
    
    index = pd.date_range('1/1/2000', periods=8)
    df = pd.DataFrame(np.random.rand(8,3), index=index, columns=list('ABC'))
    df['D'] = df['A'] / df['B']
    df['E'] = np.sum(df, axis=1)
    df = df.sub(df['A'], axis=0)
    df.head()
  • df = df.sub(df['A'], axis=0):A列ごとに全体データを減算
  • B列からA列の値を引いた値が格納されていることが判明
  • import pandas as pd
    import numpy as np
    
    index = pd.date_range('1/1/2000', periods=8)
    df = pd.DataFrame(np.random.rand(8,3), index=index, columns=list('ABC'))
    df['D'] = df['A'] / df['B']
    df['E'] = np.sum(df, axis=1)
    df = df.sub(df['A'], axis=0)
    df = df.div(df['C'], axis=0)
    df.to_csv('test.csv')    
    df.head()
  • df = df.div(df['C'], axis=0):すべてのデータをC列で区切る.
  • df.to_csv('test.csv'):データフレームを格納するcsvファイル
  • 2.Pandasで人口構造を分析する


    🌼アルゴリズム#アルゴリズム#
    1.データの読み出し
    1.1)すべてのデータを総人口の割合で割る
    1.2)総人口数と年齢層人口数の削除
    2.知りたい地域入力を取得する
    3.当該地区の人口構造を保存する
    4.この地域と人口構造が最も似ている地域を探す
    4.1)全国の全ての地域の一つを選択する
    4.2)入力地域の0歳人口比率-選定地域の0歳人口比率
    4.3)100歳以上の人口比率を計算した後、計算した値を二乗加算する
    4.4)全国の全ての地域で重複した差異が最も少ない地域を選択する
    5.両地の可視化

    1)データの読み出し

    import pandas as pd
    import numpy as np
    
    df = pd.read_csv('people.csv', index_col=0)
    df

    1.1)人口総数による列の区分と削除

    import pandas as pd
    import numpy as np
    
    df = pd.read_csv('people.csv', index_col=0)
    df = df.div(df['총인구수'], axis=0) #전체 데이터를 총인구수로 나누어 비율을 구함
    del df['총인구수'], df['연령구간인구수'] # 필요 없는 두 열 삭제
    df

    2.必要な地域の入力を受け取り、その地域の人口構造を保存する

    import pandas as pd
    import numpy as np
    
    df = pd.read_csv('people.csv', index_col=0)
    df = df.div(df['총인구수'], axis=0)
    del df['총인구수'], df['연령구간인구수']
    
    name = input('원하는 지역?')
    a = df.index.str.contains(name) #해당 문자가 있는 행 찾음
    df2 = df[a]
    df2
  • df.index.str.contains(name):データフレームのインデックス文字列に必要な文字を含む行を検索
  • import pandas as pd
    import numpy as np
    
    df = pd.read_csv('people.csv', index_col=0)
    df = df.div(df['총인구수'], axis=0)
    del df['총인구수'], df['연령구간인구수']
    
    name = input('원하는 지역?')
    a = df.index.str.contains(name)
    df2 = df[a]
    df2
    
    import matplotlib.pyplot as plt
    plt.rc('font', family='AppleGothic')
    df2.T.plot()
    plt.show()
  • 当該地域の可視化
  • 3.入力地域と人口構造が似ている地域の検索と可視化

    x = df.sub(df2.iloc[0], axis=1) # 전체지역에서 해당지역의 열과 뺄셈
    y = np.power(x, 2) # 해당값 제곱
    z = y.sum(axis=1) #제곱한 값들을 합산
  • iloc:カラムデータの読み出し
  • import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    df = pd.read_csv('people.csv', index_col=0)
    df = df.div(df['총인구수'], axis=0)
    del df['총인구수'], df['연령구간인구수']
    
    plt.rc('font', family='AppleGothic')
    plt.rcParams['axes.unicode_minus'] = False
    
    name = input('원하는 지역?')
    a = df.index.str.contains(name)
    df2 = df[a]
    
    x = df.sub(df2.iloc[0], axis=1) # 전체지역에서 해당지역의 열과 뺄셈
    y = np.power(x, 2) # 해당값 제곱
    z = y.sum(axis=1) #제곱한 값들을 합산
    
    i = z.sort_values().index[:4] # 값들의 차이가 가장 적은 지역 5개만 추출
    df.loc[i].T.plot()
    
    # df.loc[np.power(df.sub(df2.iloc[0], axis=1), 2).sum(axis=1).sort_values().index[:5]].T.plot()
    plt.show()