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()メソッドをグループオブジェクトに適用する場合、条件式を持つ関数を渡すと、条件が真のグループのみが保持されます.
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
Reference
この問題について(21.データフレームの適用−パケット演算方法(適用−マージ)), 我々は、より多くの情報をここで見つけました https://velog.io/@kdo6301/21.-데이터프레임의-응용-2.-그룹-연산-메소드적용-결합テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol