# 一文掌握Pandas量化進階 # 這節課學習Pandas更深的內容。 # 導入庫: import numpy as np import pandas as pd # 製做DataFrame np.random.seed(10) period = pd.date_range('2017-1-1', periods=10000, freq='D') df = pd.DataFrame(np.random.randn(10000, 4), columns=['Data1', 'Data2', 'Data3', 'Data4'], index = period) print(df.head()) # Data1 Data2 Data3 Data4 # 2017-01-01 1.331587 0.715279 -1.545400 -0.008384 # 2017-01-02 0.621336 -0.720086 0.265512 0.108549 # 2017-01-03 0.004291 -0.174600 0.433026 1.203037 # 2017-01-04 -0.965066 1.028274 0.228630 0.445138 # 2017-01-05 -1.136602 0.135137 1.484537 -1.079805 # 1> Group操做 # ① 一重分組 df['G1'] = np.random.choice(['A','B','C','D'],10000) # 新加一列用做分組。 grouped = df.groupby('G1') print(grouped.size()) # 查看分組狀況。 # G1 # A 2484 # B 2491 # C 2502 # D 2523 # dtype: int64 grouped.sum() # 分組求和 grouped.max() # 尋找分組最大的 grouped.mean() # 分組求平均 grouped.describe() # 分組統計量 np.transpose(grouped.describe()) # 轉置 print(grouped.get_group('A').head()) # 挑出分組爲A的DataFrame。 # ②雙重分組 # 再創建一個分組 df['G2'] = np.random.choice(['S','Y'],10000) grouped = df.groupby(['G1','G2']) # 哪一個分組在前面就先按哪一個分組分類。 # 聚合運算。按G一、G2分組後,分別求Data1和Data2的平均值和最大值。 print(grouped.agg({'Data1':np.mean, 'Data2':np.max})) # 2> 合併操做 # 創建DataFrame df1 = pd.DataFrame(['1','2','3','4'], index=['a','b','c','g'], columns=['A']) df2 = pd.DataFrame(['5','6','7','8'], index=['a','b','e','f'], columns=['B']) # ① 用concat合併DataFrame df = pd.concat((df1,df2),axis=1,ignore_index=False) # 橫向合併 print(df) # A B # a 1 5 # b 2 6 # c 3 NaN # g 4 NaN # e NaN 7 # f NaN 8 # 自動按索引合併,爲空不會報錯。 # ② DataFrame內置合併方法 df = pd.DataFrame({'A': df1['A'], 'B': df2['B']}) # ③ Join操做(有條件的合併) df1.join(df2,how='left') # 按df1的索引合併,left是默認值,還能夠寫right,inner,outer。 # ④ Merge操做 df1 = pd.DataFrame(['1','2','3','4'], index=['a','b','c','d'], columns=['A',]) df2 = pd.DataFrame(['5','6','7','8'], index=['a','b','c','d'], columns=['B',]) c = pd.Series(['10','11','12','13'], index=['a','b','c','d']) # df1和df2都新增一列。 df1['C'] = c df2['C'] = c # 合併 print(pd.merge(df1,df2,on='C')) # 該函數默認將同樣的列合併。on的默認值在這裏就是C. # A C B # 0 1 10 5 # 1 2 11 6 # 2 3 12 7 # 3 4 13 8 # 索引會重置。 # 注意,慎用這裏的on參數.當C內的數據有重複時,用on參數達不到預想的合併效果。 # 轉而用下面的方法合併。(根據索引合併) print(pd.merge(df1, df2, left_index=True, right_index=True, suffixes=['_df1','_df2'])) # A C_df1 B C_df2 # a 1 10 5 10 # b 2 11 6 11 # c 3 12 7 12 # d 4 13 8 13 # 其中還有how參數,inner和outer。當df1和df2不一樣長度時,讀者能夠本身嘗試下效果。 # 3> 層次化索引 np.random.seed(10) df = pd.Series(np.random.randn(5), index=[['a', 'a', 'b','b', 'b'], [1,2,1,2,3]]) print(df) # a 1 1.331587 # 2 0.715279 # b 1 -1.545400 # 2 -0.008384 # 3 0.621336 # a,b爲level 0,123爲level 1。 # dtype: float64 # 用unstack()從新排列 df.unstack() df.unstack().T # 轉置 df.unstack().stack() # 逆運算 print(df.sum(level=0)) # 按level0聚合 # a 2.046865 # b -0.932448 # dtype: float64 print(df.sum(level=1)) # 按level1聚合 # 1 -0.213814 # 2 0.706895 # 3 0.621336 # dtype: float64