Pandas筆記|【機器學習集訓營學員】(下)

寫在最前

Pandas是機器學習工作流程中,對數據進行預處理的重要工具。本筆記是同學在學習七月在線機器學習訓練營二期中的<pandas花式數據統計與分析技能>時的投稿筆記,分為上下兩篇。本筆記旨在記錄並整理寒老師講授的知識點,分享以供二期同學們交流及學習。

Pandas高級應用

Group

1)數據準備

#導入相關庫

import pandas as pd

import numpy as np

#建立實驗數據

salaries = pd.DataFrame({

name:[BOSS, Lilei, Lilei, Han, BOSS, BOSS, Han, BOSS],

Year:[2016,2016,2016,2016,2017,2017,2017,2017],

Salary:[999999,20000,25000,3000,9999999,999999,3500,999999],

Bonus:[100000,20000,20000,5000,200000,300000,3000,400000]

})

#簡單描述,看到索引,列,數據類型等DF結構,以及是否有空值等

salaries.info()

<class pandas.core.frame.DataFrame>

RangeIndex: 8 entries, 0 to 7

Data columns (total 4 columns):

Bonus 8 non-null int64

Salary 8 non-null int64

Year 8 non-null int64

name 8 non-null object

dtypes: int64(3), object(1)

memory usage: 336.0+ bytes

#主要對數據進行計數,看數據列的均值,離散程度,最大最小,以4分位數

salaries.describe()

salaries = salaries[[name,Year, Salary,Bonus]]#重排列

2)按照單列--名字列來做個分組

group_by_name = salaries.groupby(name)

type(group_by_name)

pandas.core.groupby.DataFrameGroupBy

3)分組後運算#如sum, size,mean,median等

group_by_name.sum()

group_by_name[[Salary,Bonus]].sum()

4)agg-並行執行多種運算

group_by_name[[Salary,Bonus]].agg([sum,mean,std,var])

5)Group對象的構成

group_by_name.groups

{BOSS: Int64Index([0, 4, 5, 7], dtype=int64),

Han: Int64Index([3, 6], dtype=int64),

Lilei: Int64Index([1, 2], dtype=int64)}

print(len(group_by_name.groups))

3

6)按多列進行分組

group_by_name_year = salaries.groupby([name,Year])

group_by_name_year.sum()

7)用迭代的方法查看分組詳情

for name, group in group_by_name:

print(name)

print(group)

BOSS

name Year Salary Bonus

0 BOSS 2016 999999 100000

4 BOSS 2017 9999999 200000

5 BOSS 2017 999999 300000

7 BOSS 2017 999999 400000

Han

name Year Salary Bonus

3 Han 2016 3000 5000

6 Han 2017 3500 3000

Lilei

name Year Salary Bonus

1 Lilei 2016 20000 20000

2 Lilei 2016 25000 20000

8)選擇不同的Group

group_by_name.get_group("Lilei")

group_by_name.get_group("BOSS")

9)同時在分組裡做幾個統agg計操作

group_by_name[[Bonus,Salary]].agg([sum,mean,std])

使用numpy下的運算函數

group_by_name[[Bonus,Salary]].agg([np.sum, np.mean, np.std]

Transform

1)數據準備

#使用Nvidia的股價數據

nvda = pd.read_csv(data/NVDA.csv, index_col=0, parse_dates=[Date])

nvda.info()

nvda.describe()

nvda.head()

2)根據已有列構造新列

nvda[year] = nvda.index.year

nvda.head()

3)刪除列

#注意inplace參數為True,代表的是原地刪除。

nvda.drop([year], axis=1, inplace=True)

4)索引列進行處理後排序

nvda.index.year#返回日期型索引的年

nvda.index.month#返回日期型索引的月

nvda.index.day#返回日期型索引的日

#如果我們想按年來先進行group,再進行統計,可以這樣來進行

key = lambda x : x.year

nvda.groupby(key).agg([mean,std]).head()

5)Transform變換

變換函數transform針對的是列:

transform=nvda.groupby(key).transform(lambda x : (x-x.mean())/x.std()).head()

transform

6)#按月取得當月內價格波動範圍

price_range = lambda x : x.max()-x.min()

nvda.groupby(lambda x:x.month).transform(price_range).head()

7)盡量把pandas的運算變成列與列之間的運算

#使用shift函數對列數據進行上下平移後產生新的列,再與原列進行運算。

salaries[Salary_shift] = salaries[Salary].shift(1)

salaries[diff] = salaries[Salary] - salaries[Salary_shift]

salaries

8)簡單繪畫

%matplotlib inline

my_compare = pd.DataFrame({Origin Adj Close:nvda[Adj Close],

Transformed Adj Close:transform["Adj Close"]})

my_compare.head()

my_compare.plot()

transform["Adj Close"].plot(grid=True)

Transform和apply

apply

對每列指定操作

nvda.groupby(key).apply(lambda x : x).head()

拼接concat

1)數據準備

df1 = pd.DataFrame({apts:[55000, 60000, 80000],

cars:[200000, 300000, 400000]})

df2 = pd.DataFrame({apts:[35000, 30000, 50000],

cars:[210000,310000,410000]})

df3 = pd.DataFrame({apts:[34000, 32000, 70000],

cars:[240000,350000,440000]})

2)縱向拼接

pd.concat([df1, df2, df3])

append一樣可以完成

df1.append(df2)

df1.append([df1,df2])

3)橫向拼接

pd.concat([df1, df2, df3],axis=1)

Merge(join)表關聯

1)數據準備

df4 = pd.DataFrame({apts:[55000, 60000, 80000],

cars:[200000, 300000, 400000]},

index = [Beijing,Shanghai,Nanjing])

df5 = pd.DataFrame({apts:[55000, 70000, 80000],

cars:[100000, 330000, 260000]},

index = [Beijing,Shanghai,Nanjing])

2)左連

pd.merge(df4, df5, on=[apts], how=left)

3)右連

pd.merge(df4, df5, on=[apts], how=right)

4)內連

pd.merge(df4, df5, on=[apts], how=inner)

5)外連

pd.merge(df4, df5, on=[apts], how=outer)

寫在最後

本篇筆記介紹pandas dataframe對象的高級應用,課後寒老師也留關於bike的一個工程。Pandas操作靈活,功能強大,對於有SQL基礎的同學來講有福氣,但對於初次接觸的同學的確需要一定的時間才能熟悉。Pandas在機器學習訓練營二期中是第三周的課程的主題,是下一步進行機器學習的數據的前站。需要反覆練習,認真做習題,來掌握Pandas這個』內存表格處理』庫。


推薦閱讀:

TAG:Python | 在线机器学习 |