Data Science — Pandas 資料科學程式馬拉松

D8 Pandas 物件的定義與屬性

補充:函式與函式庫

Pandas 的重要特性

Series 的常用屬性

import pandas as pds = pd.Series([1, 2, 3])
print(s)
# 0 1
# 1 2
# 2 3
# dtype: int64
print(type(s))
# <class 'pandas.core.series.Series'>
import pandas as pddf = pd.DataFrame([1, 2, 3])
print(df)
# 0
# 0 1
# 1 2
# 2 3
print(type(df))
# <class 'pandas.core.frame.DataFrame'>

Series、DataFrame 與 NdArray 的比較

D9 使用 Pandas DataFrame 的初始化

建立 Pandas 物件

import pandas as pds = pd.Series([1,2,3],  index=['Amy', 'Bob', 'Tom'])
print(s)
# Amy 1
# Bob 2
# Tom 3
# dtype: int64

從 Array 轉換而來

import pandas as pddf = pd.DataFrame([1, 2, 3], index=['a', 'b', 'c'], columns=['No'])
print(df)
# No
# a 1
# b 2
# c 3
import pandas as pddf = pd.DataFrame([[1, 2, 3], [4, 5, 6]], index=['a', 'b'], columns=['A', 'B', 'C'])
print(df)
# A B C
# a 1 2 3
# b 4 5 6

DataFrame 的來源樣態可以很多元

import pandas as pddf = pd.DataFrame([[1, 2, 3], [4, 5, 6]], index=['a', 'b'], columns=['A', 'B', 'C'])
print(df)
# A B C
# a 1 2 3
# b 4 5 6
print(df['B'])
# a 2
# b 5
# Name: B, dtype: int64
print(type(df['B']))
# <class 'pandas.core.series.Series'>

D10 Pandas DataFrame 的資料選取

從 DataFrame 選取資料

合併資料

合併(merge)

利用欄位名稱選取單行資料

import pandas as pddf = pd.DataFrame([[1, 2, 3], [4, 5, 6]], index=['a', 'b'], columns=['A', 'B', 'C'])print(df[['A', 'B']])
print(df[['A', 'C']])

利用列索引位置選取單列/多列資料

import pandas as pddf = pd.DataFrame([[1, 2, 3], [4, 5, 6]], index=['a', 'b'], columns=['A', 'B', 'C'])print(df[0:1])
print(df[0:2])

用 loc, iloc, ix 取得行與列

import pandas as pddf = pd.DataFrame([[1, 2, 3], [4, 5, 6]], index=['a', 'b'], columns=['A', 'B', 'C'])print(df.loc['a', 'A']) # 1
print(df.loc['a', ['A', 'B']])
print(df.loc[['a', 'b'], 'A'])
print(df.loc[['a', 'b'], ['A', 'B']])

根據條件篩選資料(遮罩)

D11 Pandas 中的算術運算特性

相同欄位的算術運算

mport pandas as pddf1 = pd.DataFrame([[1, 2, 3]])
df2 = pd.DataFrame([[1, 1, 1]])
print(df1 + df2)
# 0 1 2
# 0 2 3 4

比較和邏輯運算

print(df > 2)
# A B C
# a False False True
# b True True True
print(df[df > 2])
# A B C
# a NaN NaN 3
# b 4.0 5.0 6

DataFrame 中的排序

import pandas as pddf = pd.DataFrame({
'col1': ['A', 'a', 'B', 'b'],
'col2': [2, 1, 9, 8],
})
df.sort_values(by=['col1'])

DataFrame 的字串方法

統計函式 平均值mean()

統計函式 加總sum() 、個數count()

統計函式:中位數median()

統計函式:百分位數quantile()

統計函式:最大值max()、最小值min()

統計函式:標準差std(),變異數var()

統計函式:相關係數corr()

自訂義的行或列函式應用 apply()

D12 Pandas 迭代與重複操作

橫向的資料迭代

import pandas as pddf = pd.DataFrame({
'name': ['Alice', 'Bob'],
'age': [20, 32]
})
for i in range(len(df)):
print(df.iloc[i])
for d in df.iteritems():
print(d)
for d in df.iterrows():
print(d)
for d in df.itertuples():
print(d)
1.
('name', 0 Alice 1 Bob Name: name, dtype: object)
('age', 0 20 1 32 Name: age, dtype: int64)
2.
(0, name Alice age 20 Name: 0, dtype: object)
(1, name Bob age 32 Name: 1, dtype: object)
3.
Pandas(Index=0, name='Alice', age=20)
Pandas(Index=1, name='Bob', age=32)

apply

df.apply(lambda x: x.max() - x.min())

map

df = pd.DataFrame({
'score': [98, 67, 85],
'age': [20, 32, 28]
})
df['age'].map(lambda x: -x)

applymap

df = pd.DataFrame({
'score': [98, 67, 85],
'age': [20, 32, 28]
})
df.applymap(lambda x: -x)

Map、 Apply、Applymap

不建議在 DataFrame 進行迭代操作

D13 Pandas Dataframe 的新增與刪除

從 DataFrame 中插入或刪除資料

= 可以用來增加行(欄)

df = pd.DataFrame([[1], [2]], columns = ['a'])
df['b'] = pd.Series([3, 4])

append() 可以用來新增列(資料)

df = pd.DataFrame([[1, 2]], columns = ['a', 'b'])
df = df.append(pd.DataFrame([[3, 4]], columns = ['a', 'b']))
df = df.append(pd.DataFrame([[3, 4]], columns = ['a', 'b']))
df = df.reset_index(drop=True)

del 或 pop() 可以用來刪除行(欄)

drop() 可以用來刪除列(資料)

DataFrame 的合併與重組

連集(Concat)

one = pd.DataFrame({
'id':[1, 2],
'Name': ['Alex', 'Amy'],
})
two = pd.DataFrame({
'id':[1, 2],
'Name': ['Bob', 'Tom']
})
pd.concat([one, two])
one = pd.DataFrame({
'id':[1, 2],
'Name': ['Alex', 'Amy'],
})
two = pd.DataFrame({
'id':[1, 2],
'Name': ['Bob', 'Tom']
})
pd.concat([one, two]).reset_index(drop=True)

合併(merge)

one = pd.DataFrame({
'id':[1, 2],
'Name': ['Alex', 'Amy'],
})
two = pd.DataFrame({
'id':[1, 2],
'Score': [98, 60]
})
pd.merge(one, two, on='id')

連接(Join)

one = pd.DataFrame({
'Name': ['Alex', 'Amy'],
})
two = pd.DataFrame({
'Score': [98, 60]
})
one.join(two)

分組(Group)

df = pd.DataFrame({
'A' : ['foo', 'bar', 'foo', 'bar'],
'B' : ['one', 'one', 'two', 'three'],
'C' : [1,2,3,4],
'D' : [10, 20, 30, 40]
})
df.groupby('A').sum()
df.groupby('A').agg(sum)
df.groupby(['A','B']).sum()

D14 Pandas 的外部資料存取

建立 Pandas 物件

認識類別資料

認識缺值處理方法與應用函式 定值補值 / 前後補值

df.fillna(number / mean .etc)
# 函式一樣使用 fillna(),我們只需要進一步運用參數method=‘ffill’即可填補前一列數值, method=‘bfill’ 填補後一列數值
temp_data.fillna(method='fill')

Missing Value 是什麼?

缺值資料的處理

D15 用 Pandas 撰寫樞紐分析表(略)

D16 用 Pandas 執行聚合運算(Split-Apply-Combine Strategy)

認識 groupby

你的 dataframe 變數名稱.groupby(['要分析之行的名稱']).運算函數名稱()
上圖為表一

認識 Split-Apply-Combine 策略

Groupby 針對多個欄位做分析

Groupby 針對欄位做多個分析

Groupby 同時針對多個欄位做多個分析

D17 Pandas 時間序列資料處理

時間序列資料處理

df = pd.Series([1, 2, 3, 4, 5], index=pd.period_range('2021-01-01', freq='Y', periods=5))
df
df.resample('Q', convention='start').asfreq()

D18 Pandas 大型資料處理與效能調校

效能調校

理科與藝術交織成靈魂的會計人,喜愛戲劇與攝影,但也喜歡資料科學。

理科與藝術交織成靈魂的會計人,喜愛戲劇與攝影,但也喜歡資料科學。