21.データフレームの適用−パケット演算方法(適用−マージ)

26746 ワード

🔔 データの集約


前に分割したグループオブジェクトに対して各グループの平均値を計算するように、グループオブジェクトに異なる演算を適用できます.このプロセスをデータ統計と呼ぶ.
集約機能を内蔵したPandasベース関数は、次のとおりです.

mean()、max()、min()、sum()、count()、size()、var()、std()、describe()、info()、first()、last()など。


標準偏差データセット:オブジェクトをグループ化します.std()

import pandas as pd
import seaborn as sns

titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age','sex','class','fare','survived']]

grouped = df.groupby(['class'])

# 각 그룹에 대한 모든 열의 표준편차를 집계하여 데이터프레임으로 변환
std_all = grouped.std()
print(std_all)
          age       fare  survived
class
First   14.802856  78.380373  0.484026
Second  14.001077  13.417399  0.500623
Third   12.495398  11.778142  0.428949

💡 Firstclassの金額の標準偏差が高いことがわかります。


集約演算を処理するユーザ定義関数をグループオブジェクトに適用するにはagg()メソッドを使用する必要があります。


集約agg()メソッドデータ:groupオブジェクト.Agg(マッピング関数)

def min_max(x):
    return x.max() - x.min()

agg_minmax = grouped.agg(min_max)
print(agg_minmax.head())
          age      fare  survived
class
First   79.08  512.3292         1
Second  69.33   73.5000         1
Third   73.58   69.5500         1
また、複数の関数を同時に使用して、各グループのデータを統計的に演算することもできます.
  • は、複数の関数をすべてのカラムにマッピングします.
    グループオブジェクト.Agg([関数1,関数2,関数3])
  • は、カラムごとに異なる関数をマッピングします.
    グループオブジェクト.Agg({"列1":関数1,"列2":関数2...})
  • agg_all = grouped.agg(['min','max'])
    print(agg_all.head())
    
    agg_sep = grouped.agg({'fare':['min','max'],'age':'mean'})
    print(agg_sep.head())
    
               age           sex              fare       survived    
            min   max     min   max        min   max      min max
    class
    First   0.92  80.0  female  male  0.0  512.3292        0   1
    Second  0.67  70.0  female  male  0.0   73.5000        0   1
    Third   0.42  74.0  female  male  0.0   69.5500        0   1
    
                fare             age
            min       max       mean
    class
    First   0.0  512.3292  38.233441
    Second  0.0   73.5000  29.877630
    Third   0.0   69.5500  25.140620
  • 組演算データ変換
  • 前述したagg()メソッド->各グループのデータに区切り関数を適用して演算します。


    transform()メソッド->各要素に関数をグループごとに区切って適用しますが、グループごとの統計ではなく、各要素に基づく元の行インデックスとカラム名を返します。


    つまり、グループ演算の結果を元のデータフレームと同じフォーマットに変換して整理する。


    データ変換演算:groupオブジェクト。変換(マッピング関数)


    ❗どういう意味かを正確に理解するために、例を見てみましょう。

    import pandas as pd
    import seaborn as sns
    
    titanic = sns.load_dataset('titanic')
    df = titanic.loc[:,['age','sex','class','fare','survived']]
    
    grouped = df.groupby(['class'])
    
    age_mean = grouped.age.mean()
    print(age_mean,'\n')
    
    age_std = grouped.age.std()
    print(age_std,'\n')
    
    # 그룹 객체의 age열을 iteration 으로 z-score 계산하여 출력
    for key, group in grouped.age:
        group_zscore = (group - age_mean.loc[key]) / age_std.loc[key]
        print('* origin : ', key)
        print(group_zscore.head(3))
        print('\n')
    
    class
    First     38.233441
    Second    29.877630
    Third     25.140620
    Name: age, dtype: float64 
    
    class
    First     14.802856
    Second    14.001077
    Third     12.495398
    Name: age, dtype: float64
    
    * origin :  First
    1   -0.015770
    3   -0.218434
    6    1.065103
    Name: age, dtype: float64
    
    * origin :  Second
    9    -1.134029
    15    1.794317
    17         NaN
    Name: age, dtype: float64
    
    * origin :  Third
    0   -0.251342
    2    0.068776
    4    0.789041
    Name: age, dtype: float64
    今回はtransform()メソッドを使用して「age」列のデータをz-scoreに直接変換します.
    z scoreを計算するユーザ関数を定義し、transform()メソッドのパラメータとして渡します.
    def z_score(x):
    	return (x-x.mean())/x.std()
    
    # transform() 메소드를 이용하여 age열의 데이터를 z-score로 변환
    age_zscore = grouped.age.transform(z_score)
    
    print(age_zscore.loc[[1,9,0]] # 1,2,3 그룹의 첫 데이터 확인 
    print('\n')
    
    print(len(age_zscore)) # transform 메소드 반환 값의 길이
    print('\n')
    
    print(age_zscore.loc[0:9]) # transform 메소드 반환 값 출력 (첫 10개)
    print('\n')
    
    print(type(age_zscore)) # transform 메소드 반환 객체의 자료형
    
    1   -0.015770
    9   -1.134029
    0   -0.251342
    Name: age, dtype: float64
    
    891
    
    0   -0.251342
    1   -0.015770
    2    0.068776
    3   -0.218434
    4    0.789041
    5         NaN
    6    1.065103
    7   -1.851931
    8    0.148805
    9   -1.134029
    Name: age, dtype: float64
    
    <class 'pandas.core.series.Series'>
  • グループオブジェクトフィルタ
    :filter()メソッドをグループオブジェクトに適用する場合、条件式を持つ関数を渡すと、条件が真のグループのみが保持されます.
  • ≪グループ・オブジェクトのフィルタ|Filter Group Objects|oem_src≫:グループ・オブジェクト.ろ過器(条件式)
    import pandas as pd
    import seaborn as sns
    
    titanic = sns.load_dataset('titanic')
    df = titanic.loc[:,['age','sex','class','fare','survived']]
    
    grouped = df.groupby(['class'])
    
    # 데이터 개수가 200개 이상인 그룹만을 필터링하여 데이터프레임으로 변환
    group_filter = grouped.filter(lambda x : len(x)>=200)
    print(group_filter.head())
    
    print('\n')
    
    print(type(group_filter))
    
    今回は「age」列の平均値が30未満のグループのみをフィルタします
    
    age_filter = grouped.filter(lambda x : x.age.mean()<30)
    print(age_filter.tail())
    print('\n')
    
    print(type(age_filter))
          age     sex   class    fare  survived
    884  25.0    male   Third   7.050         0
    885  39.0  female   Third  29.125         0
    886  27.0    male  Second  13.000         0
    888   NaN  female   Third  23.450         0
    890  32.0    male   Third   7.750         0

    ❗平均年齢30歳以下の組み合わせは「Second」と「Third」の2等席と3等席のみです。


    関数を
  • グループオブジェクト
  • にマッピング

    汎用メソッド:groubuオブジェクト。適用(マッピング関数)


    「class」列に基づいて分割された3つのパケットにdescribe()メソッドを適用し、要約統計を表します.
    import pandas as pd
    import seaborn as sns
    
    titanic = sns.load_dataset('titanic')
    df = titanic.loc[:,['age','sex','class','fare','survived']]
    
    grouped = df.groupby(['class'])
    
    agg_grouped = grouped.apply(lambda x : x.describe())
    
    print(agg_grouped)
    
                         age        fare    survived
    class
    First  count  186.000000  216.000000  216.000000
           mean    38.233441   84.154687    0.629630
           std     14.802856   78.380373    0.484026
           min      0.920000    0.000000    0.000000
           25%     27.000000   30.923950    0.000000
           50%     37.000000   60.287500    1.000000
           75%     49.000000   93.500000    1.000000
           max     80.000000  512.329200    1.000000
    Second count  173.000000  184.000000  184.000000
           mean    29.877630   20.662183    0.472826
           std     14.001077   13.417399    0.500623
           min      0.670000    0.000000    0.000000
           25%     23.000000   13.000000    0.000000
           50%     29.000000   14.250000    0.000000
           75%     36.000000   26.000000    1.000000
           max     70.000000   73.500000    1.000000
    Third  count  355.000000  491.000000  491.000000
           mean    25.140620   13.675550    0.242363
           std     12.495398   11.778142    0.428949
           min      0.420000    0.000000    0.000000
           25%     18.000000    7.750000    0.000000
           50%     24.000000    8.050000    0.000000
           75%     32.000000   15.500000    0.000000
           max     74.000000   69.550000    1.000000
    今回はz-scoreを計算するユーザ関数を用いて「age」列のデータをz-scoreに変換します.
    
    def z_score(x):
        return (x-x.mean())/x.std()
    
    age_zscore = grouped.age.apply(z_score)
    print(age_zscore.head())
    
    0   -0.251342
    1   -0.015770
    2    0.068776
    3   -0.218434
    4    0.789041
    Name: age, dtype: float64
    今回,「age」列の平均値が30未満,すなわち平均年齢が30歳未満の群を判別した.
    
    age_filter = grouped.apply(lambda x : x.age.mean()<30)
    print(age_filter)
    
    for i in age_filter.index :
        if age_filter[i]==True :
            age_filter_df = grouped.get_group(i)
            print(age_filter_df.head())
            print('\n')
    
        class
        First     False
        Second     True
        Third      True
        dtype: bool
    
        age     sex   class     fare  survived
        9   14.0  female  Second  30.0708         1
        15  55.0  female  Second  16.0000         1
        17   NaN    male  Second  13.0000         1
        20  35.0    male  Second  26.0000         0
        21  34.0    male  Second  13.0000         1
    
            age     sex  class     fare  survived
        0  22.0    male  Third   7.2500         0
        2  26.0  female  Third   7.9250         1
        4  35.0    male  Third   8.0500         0
        5   NaN    male  Third   8.4583         0
        7   2.0    male  Third  21.0750         0