MaDi's Blog

一個紀錄自己在轉職軟體工程師路上的學習小空間

0%

Pandas常用語法整理(四) 資料分組 Groupby/高效率運算函式eval,query

Table of Contents:

  1. 資料分組: groupby/aggregate/apply
  2. group屬性與方法: str.count/groups/size/get_group
  3. 高效率運算函式: pd.eval/df.query

資料分組

先建立一個NBA球員的DataFrame

1
demo = pd.DataFrame({'球隊':['湖人','勇士','湖人','勇士(富邦)'],'球員':['Kobe','Curry','Lebron','林書緯'],'薪資':[1000,900,800,200]})

groupby()

計算球隊總薪資

1
demo.groupby(['球隊']).sum()

也可以用多個名稱來分組

1
demo.groupby(['球隊','球員']).sum()

aggregate()

一次計算sum(),min(),max()…

1
demo.groupby(['球隊'])['薪資'].aggregate(['sum','max','min'])

apply()

呼叫lambda函式或是一般函式來運算

1
2
3
4
5
6
7
8
demo.groupby(['球隊']).apply(lambda x: x['薪資']>500)

球隊
勇士 1 True
勇士(富邦) 3 False
湖人 0 True
2 True
Name: 薪資, dtype: bool
1
demo[demo['薪資'].apply(lambda x: x>500)]

str.count()

DataFrame[某欄位].str.count(關鍵字)

計算某欄位出現給定的關鍵字的數量

1
2
3
4
5
6
7
demo['球隊'].str.count('人')

0 1
1 0
2 1
3 0
Name: 球隊, dtype: int64

group.size()

看分組後的資料大小(多寡)

1
2
3
4
5
6
7
8
group = demo.groupby('球隊')
group.size()

球隊
勇士 1
勇士(富邦) 1
湖人 2
dtype: int64

group.groups

看分組後的組別

1
2
3
4
group = demo.groupby('球隊')
group.groups

{'勇士': [1], '勇士(富邦)': [3], '湖人': [0, 2]}

group.get_group()

取得分組後的某組別資料

1
2
group = demo.groupby('球隊')
group.get_group('湖人')

Pandas高效率運算函式

pd.eval()

功能強大,將字符串str當成有效的表達式來求值並返回計算結果
常用來設定config檔的參數

建立三個df並計算加總,比較有無eval的效率差異

1
2
3
4
5
6
7
8
df1,df2,df3 = (pd.DataFrame(np.random.randint(0,10,(4,2))) for i in range(3))

%timeit df1+df2+df3
%timeit pd.eval('df1+df2+df3')

# eval快很多
1.47 ms ± 171 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
4.55 ms ± 314 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

df.query()

功能強大,用來查詢符合條件的資料

建立df並查詢條件,比較有無query的效率差異

1
2
3
4
5
6
7
8
df = pd.DataFrame(np.random.randint(0,10,(4,2)), columns=['A','B'])

%timeit df['A']>df['B']
%timeit df.query('A>B')

# query快很多
635 µs ± 70.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
5.86 ms ± 232 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

參考

[Day13]Learning Pandas - 處理資料分組