今天是鐵人第13天,不要懷疑還是在Pandas,再過幾天就可以跳脫了....,今天主要是介紹Pandas裡面資料計算和分組
以下用Series示範上述涵式
import numpy as np
import pandas as pd
ironman_ser = pd.Series(np.random.randint(10, size=6))
print(ironman_ser)
print('陣列中的總和--------------->',ironman_ser.sum())
print('陣列中的平均值------------->',ironman_ser.mean())
print('陣列中middle two的平均值--->',ironman_ser.median())
print('陣列中最小值--------------->',ironman_ser.min())
print('陣列中最大值--------------->',ironman_ser.max())
# 輸出結果
0 7
1 4
2 6
3 7
4 7
5 8
dtype: int32
陣列中的總和---------------> 39
陣列中的平均值-------------> 6.5
陣列中middle two的平均值---> 7.0
陣列中最小值---------------> 4
陣列中最大值---------------> 8
示範用DataFrame進行運算,預設會用欄做計算,如果要改成用列作計算可使用axis
ironman_df = pd.DataFrame({'A':np.random.randint(10, size=6), 'B':np.random.randint(10, size=6)})
print(ironman_df)
ironman_df.sum() #如果想用列作計算可以使用 ironman_df.sum(axis='columns')
# 輸出結果
A B
0 3 6
1 3 1
2 1 8
3 0 6
4 4 5
5 0 1
A 11
B 27
dtype: int64
Pandas中使用的計算方法
計算 | 描述 |
---|---|
count() | 元素總數 |
first(),last() | 第一個,最後一個元素 |
mean(),median() | 全部平均,中位數平均 |
min(),max() | 最小值,最大值 |
std(),var() | 標準差,變異數 |
mad() | 平均絕對差 |
prod() | 元素的積 |
sum() | 所有元素的總和 |
之前介紹的聚合資料運算都是針對全部的元素,如果想要針對某些索引做計算可以透過groupby
示範建立一個DataFrame,並算出每個team('A','B','C')的總和
ironman_df = pd.DataFrame({'team':['A','B','C','C','B','B'],'number':np.random.randint(10, size=6)}, columns=['team','number'])
print(ironman_df)
ironman_df.groupby('team').sum() #
# 輸出結果
team number
0 A 9
1 B 6
2 C 9
3 C 4
4 B 2
5 B 9
number
team
A 9
B 17
C 13
ironman_df.groupby('team').aggregate(['sum','max','min'])
# 輸出結果
number
sum max min
team
A 9 9 9
B 17 9 2
C 13 9 4
def filter_func(x):
return x['number'].sum() > 10
ironman_df.groupby('team').filter(filter_func)
# 輸出結果(可以看到A team被過濾掉了)
team number
1 B 6
2 C 9
3 C 4
4 B 2
5 B 9
ironman_df.groupby('team').transform(lambda x: x- x.sum())
# 輸出結果
number
0 0
1 -11
2 -4
3 -9
4 -15
5 -8
def apply_func(x):
x['number'] = x['number'] - x['number'].sum()
return x
ironman_df.groupby('team').apply(apply_func)
# 輸出結果
team number
0 A 0
1 B -11
2 C -4
3 C -9
4 B -15
5 B -8
其他指定groupby分組條件的方式
以下示範自己定義不同的分組組別來做總和。
newList = [0,1,1,2,0,2]
ironman_df.groupby(newList).sum()
# 輸出結果
number
0 11
1 15
2 13
現在要用seaborn內建的數據庫來表示樞紐分析表,seaborn有哪些內建的數據庫可以看這裡
pviot_table函式呼叫的參數
DataFrame.pviot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
以下示範鐵達尼存活的平均值用艙做分類
import seaborn as sns
titanic = sns.load_dataset('titanic')
titanic.pivot_table('survived', index='sex', columns='class')
# 輸出結果(aggfunc預設是平均值)
class First Second Third
sex
female 0.968085 0.921053 0.500000
male 0.368852 0.157407 0.135447
可操作的函式如下
len() lower() translate() islower()
ljust() upper() starswitch() issupper()
rjust() find() endswitch() isnumeric()
center() rfind() isalnum() isdecimal()
zfill() index() isalpha() split()
strip() rindex() isdigit() rsplit()
rstrip() capitalize() isspace() partition()
lstrip() swapcase() istitle() rpartition()
match() extract() findall() replace()
contains() count() get() slice_replace()
slice() cat() repeat() normalize()
pad() wrap() join() get_dummies()
範例:Series回傳小寫字串,如果是DataFrame需要針對某個欄位做操作
ironman = pd.Series(['Elephant','Lion','Lamigo','Guardian'])
ironman.str.lower()
# 輸出結果
0 elephant
1 lion
2 lamigo
3 guardian
dtype: object
範例:用正規表示
ironman.str.extract('([ELa-z]+)')
# 輸出結果
0
0 Elephant
1 Lion
2 Lamigo
3 uardian
範例:文字切片
ironman.str.slice(0,3)
# 輸出結果
0 Ele
1 Lio
2 Lam
3 Gua
dtype: object