Groupby and transformation

Submitted by tinhxleev2 on Tue, 06/02/2020 - 07:51

Trong phân tích dữ liệu chúng ta vẫn thường hay groupby và áp dụng chuyển đổi dữ liệu vào nhóm. Việc này sẽ không làm thay đổi index trong khi vẫn chuyển đổi dữ liệu bằng hàm áp dụng cho group. 

Một ví dụ cho hàm áp dụng vào cho groupby

def zscore(series): 

     return (series - mean(series)) /series.std()

Đọc file automobile bên dưới - bộ dữ liệu này về hiệu năng tiêu thụ xăng theo dặm của các loại xe từ năm 1970 tới năm 1982

import pandas as pd

Mình thiết lập dataframe này và đặt tên nó là 

auto = pd.read_csv('http://ledinhtinh.com/sites/default/files/2020-06/datasets_1489_2704_auto-mpg.csv')

In phần head

print(auto.head())

# cho kết quả 

 mpg  cylinders  displacement horsepower  weight  acceleration  model year  origin                   car name
0  18.0          8         307.0        130    3504          12.0          70       1  chevrolet chevelle malibu
1  15.0          8         350.0        165    3693          11.5          70       1          buick skylark 320
2  18.0          8         318.0        150    3436          11.0          70       1         plymouth satellite
3  16.0          8         304.0        150    3433          12.0          70       1              amc rebel sst
4  17.0          8         302.0        140    3449          10.5          70       1                ford torino

Chức năng zscore có thể áp dụng vào cột mpg của auto dataframe

zscore(auto['mpg']).head()

# Kết quả ở hàng số 2 có giá trị thấp hơn một std so với mean của series.

0   -0.705551
1   -1.089379
2   -0.705551
3   -0.961437
4   -0.833494
Name: mpg, dtype: float64

Một cách thay thế sử dụng groupby 'model year' thay vì toàn bộ phân bổ

auto.groupby('model year').['mpg'].transform(zscore).head()

# Kết quả ở đây do mình groupby 'model year' sau đó chuyển đổi giá trị ở cột 'mpg' bằng zscore theo năm rồi kết hợp lại với bản gốc. Từ kết quả này cho thấy ở dòng 2 giá trị mpg thấp hơn 0.5 std so với mean của mpg theo năm. 

0    0.058125
1   -0.503753
2    0.058125
3   -0.316460
4   -0.129168
Name: mpg, dtype: float64

Áp dụng chuyển đổi và tổng hợp (transformation and aggregation) 

def zscore_year_name(group): 

 df = pd.DataFrame(

                 {'mpg': zscore(group['mpg']),

          'model year': group['model year'],

          'name': group['car name']})

 return df

Trường hợp sự chuyển đổi quá phức tạp thì có thể sư dụng .apply

auto.groupby('model year').apply(zscore_year_name).head()

practice_file