pandas thay thế vòng lặp

Viết mã Python hiệu quả

Logan Thomas

Scientific Software Technical Trainer, Enthought

print(baseball_df.head())
  Team League  Year   RS   RA   W    G  Playoffs
0  ARI     NL  2012  734  688  81  162         0
1  ATL     NL  2012  700  600  94  162         1
2  BAL     AL  2012  712  705  93  162         1
3  BOS     AL  2012  734  806  69  162         0
4  CHC     NL  2012  613  759  61  162         0
def calc_run_diff(runs_scored, runs_allowed):

    run_diff = runs_scored - runs_allowed

    return run_diff
Viết mã Python hiệu quả

Tính hiệu số điểm bằng vòng lặp

run_diffs_iterrows = []

for i,row in baseball_df.iterrows():
    run_diff = calc_run_diff(row['RS'], row['RA'])
    run_diffs_iterrows.append(run_diff)

baseball_df['RD'] = run_diffs_iterrows
print(baseball_df)
     Team League  Year   RS   RA    W    G  Playoffs   RD
0     ARI     NL  2012  734  688   81  162         0   46
1     ATL     NL  2012  700  600   94  162         1  100
2     BAL     AL  2012  712  705   93  162         1    7
...
Viết mã Python hiệu quả

Phương thức pandas .apply()

  • Nhận một hàm và áp dụng cho DataFrame
    • Phải chỉ định trục (0 cho cột; 1 cho hàng)
  • Có thể dùng với hàm ẩn danh (hàm lambda)
  • Ví dụ:
baseball_df.apply(

lambda row: calc_run_diff(row['RS'], row['RA']),
axis=1 )
Viết mã Python hiệu quả

Tính hiệu số điểm với .apply()

run_diffs_apply = baseball_df.apply(
         lambda row: calc_run_diff(row['RS'], row['RA']),
         axis=1)

baseball_df['RD'] = run_diffs_apply print(baseball_df)
     Team League  Year   RS   RA    W    G  Playoffs   RD
0     ARI     NL  2012  734  688   81  162         0   46
1     ATL     NL  2012  700  600   94  162         1  100
2     BAL     AL  2012  712  705   93  162         1    7
...
Viết mã Python hiệu quả

So sánh cách tiếp cận

%%timeit
run_diffs_iterrows = []

for i,row in baseball_df.iterrows():
    run_diff = calc_run_diff(row['RS'], row['RA'])
    run_diffs_iterrows.append(run_diff)

baseball_df['RD'] = run_diffs_iterrows
86.8 ms ± 3 ms mỗi vòng (trung bình ± độ lệch chuẩn của 7 lần chạy, 10 vòng mỗi lần)
Viết mã Python hiệu quả

So sánh cách tiếp cận

%%timeit
run_diffs_apply = baseball_df.apply(
         lambda row: calc_run_diff(row['RS'], row['RA']),
         axis=1)

baseball_df['RD'] = run_diffs_apply
30.1 ms ± 1.75 ms mỗi vòng (trung bình ± độ lệch chuẩn của 7 lần chạy, 10 vòng mỗi lần)
Viết mã Python hiệu quả

Luyện tập dùng phương thức pandas .apply()!

Viết mã Python hiệu quả

Preparing Video For Download...