Try   HackMD

第三天 111-09-30 Python入門實作班上課記錄

tags: python

引入pandas模組

import pandas as pd

說明:
引入pandas模組,本日課程所有範例都需要引入

以List建立一個Series

s = pd.Series([13, 30, 77, 6, 111, 10])
print(s)

Series基本操作

names = ['Aaron', 'Amber', 'Andy', 'Apple']
no = [32, 12, 42, 'A']
s = pd.Series(names, index=no)
print(s)
print(s[12])  # 取出Amber
print(s[ [32, 42] ])

print(s.index)   # Series裡面的全部索引 
print(s.values)  # Series理面全部的值

將Series裡面的資料都加上10的兩種做法

for comperhension做法
scores = [23, 45, 67, 34, 98]

newScore = [s + 10 for s in scores] # for comperhension
print(newScore)
Series做法
s = pd.Series(scores)
print(s + 10)
print((s - 1) * 2)

建立DataFrame

data = {
    '學號': [1, 2, 3, 4, 5],
    '姓名': ['Aaron', 'Amber', 'Abner', 'Apple', 'Astrid'],
    '國文': [100, 90, 80, 70, 60],
    '英文': [90, 80, 70, 60, 50],
    '數學': [100, 95, 85, 75, 65]
}

df = pd.DataFrame(data)
print(df)

自訂DataFrame索引

index = ['0101', '0102', '0103', '0104', '0105']  # 自訂索引
df = pd.DataFrame(data, index=index)
print(df)

欄和列的位置對調

print(df.T)

讀取csv

df1 = pd.read_csv('Fstdata.csv', encoding='utf-8') # 讀入csv檔並產生DataFrame物件
print(df1)

儲存為excel

df1.to_excel('Fstdata.xlsx')

讀取excel

df2 = pd.read_excel('Fstdata.xlsx')
print(df2)

取得DataFrame每一列資料

for index, row in df2.iterrows():
    print(index, row)

其他操作

print(df2.head(1))  # 拿第一筆資料
print(df2.tail(1))  # 拿最後一筆資料

df2.info()

print(len(df2)) # 查資料筆數
print(df2.shape)  # 看輪廓
print(s.shape)  # Series也可以看輪廓(這行要配合一開始的Series建立才能執行)

定位DataFrame的方式

data = {
    '學號': [1, 2, 3, 4, 5],
    '姓名': ['Aaron', 'Amber', 'Abner', 'Apple', 'Astrid'],
    '國文': [100, 90, 80, 70, 60],
    '英文': [90, 80, 70, 60, 50],
    '數學': [100, 95, 85, 75, 65]
}

index = ['A', 'B', 'C', 'D', 'E']
df = pd.DataFrame(data, index=index)
print(df)
print('-----------------------------')
print(df['姓名'].head(2))
print(df.姓名.head(2))

print('-----------------------------')
print(    df[    ['姓名', '學號']   ].head(2)     )  # 取得姓名和學號的前兩筆資料
print('-----------------------------')
print(df[1:2])
print(df['B':'C'])

使用loc來定位資料

print(df.loc['A'])
print(df.loc[:, '姓名'])

print(df.loc['B':'D',  ['學號','姓名'] ])

print('-----------------------------')
print(df.loc['E', '數學'])

print('-----------------------------')
print(df.loc['D':'E', ['國文', '英文']])

另有iloc可以用索引來定位,請參考講義

修改DataFrame資料

data = {
    '學號': [1, 2, 3, 4, 5],
    '姓名': ['Aaron', 'Amber', 'Abner', 'Apple', 'Astrid'],
    '國文': [100, 90, 80, 70, 60],
    '英文': [90, 80, 70, 60, 50],
    '數學': [100, 95, 85, 75, 65]
}

index = ['A', 'B', 'C', 'D', 'E']
df = pd.DataFrame(data, index=index)
print(df)

print(df[   df.國文 >= 80    ])  # 依條件取得資料

print(  df[ (df.國文 >= 60) & (df.數學 >= 60) & (df.英文 >= 60)]  )

小小練習

取得人生藥局的快篩剩餘量(與第一週的範例比較)

df1 = pd.read_csv('Fstdata.csv', encoding='utf-8')

df1.info()

df2 = df1[ df1.醫事機構名稱.str.contains('人生') ]  # 過濾人生藥局,過完後會拿到新的DataFrame

print(df2.iloc[:, [1, 7]])

其他快篩相關資訊

df1.set_index('快篩試劑截至目前結餘存貨數量')
df1.sort_values(['快篩試劑截至目前結餘存貨數量'], ascending=False, inplace=True)
df_top_10 = df1.head(10)  # 取得前10明快篩剩餘最多的藥局
print(df_top_10.iloc[:, [1, 7]])

df1.set_index('快篩試劑截至目前結餘存貨數量', inplace=True)
df1.sort_values(['快篩試劑截至目前結餘存貨數量'], ascending=False, inplace=True)
df_top_10 = df1.head(10)  # 取得前10明快篩剩餘最多的藥局
print(df_top_10.iloc[:, [1, 7]])

groupBy合併資訊

data = {
    '日期': ['2021-01-01', '2021-01-02', '2021-01-01', '2021-01-03', '2021-01-01', '2021-01-02', '2021-01-03'],
    '交通': [100, 50, 60, 899, 32, 97, 21],
    '旅遊': [102, 30, 160, 89, 321, 197, 221],
    '其他': ['cc', 'ee', '160', '89', '321', '197', '221']
}

df = pd.DataFrame(data)

df_sum = df.groupby('日期')[['交通', '旅遊']].sum()
print(df_sum)

apply對欄位作特定動作

def to_japan(val):
    return int(val / 3)  # 將資料除以三後去掉小數點

s_result = df['旅遊'].apply(to_japan)

print((s_result))

df['旅遊'] = list(s_result)  # 將處理後的新址料存回原DataFrame
print(df)

刪除資料

data = {
    '學號': [1, 2, 3, 4, 5],
    '姓名': ['Aaron', 'Amber', 'Abner', 'Apple', 'Astrid'],
    '國文': [100, 90, 80, 70, 60],
    '英文': [90, 80, 70, 60, 50],
    '數學': [100, 95, 85, 75, 65]
}

df = pd.DataFrame(data)
print(df)
df = df.drop([1, 4])  # 刪除第1, 4列
print(df)

df = df.drop(['國文'], axis=1)  # axis=1 刪除欄
print(df)

使用iloc定位,修改資料

df.iloc[0,1] = 'Aaron Ho'
print(df)

df['哈囉'] = [1,2,3]
print(df)