pandas實用trick

pandas實用trick

1.向量操作

有一組數據,需要實現如下功能:"Time"是日期-時分秒的格式,現在要求把"Time"拆爲日期和時分秒兩列,“day"和"hhmmss”。
採用iloc,iterrows、itertuple、apply實現上述功能,並對其進行性能比較。

 import pandas as pd
   column = ['Time', 'val1', 'val2', 'val3', 'val4']
    data = [['20190603-09:41:45', 11, 8, 17.12, 7.7],
            ['20190603-09:41:48', 12, 9.2, 12.23, 3.6],
            ['20190603-09:41:51', 12, 9.3, 15.13, 5.8],
            ['20190603-09:41:54', 13, 3.4, 11.9, 2.4],
            ['20190603-09:41:57', 14, 2.6, 9.3, 3.7],
            ['20190603-09:42:32', 15, 3.0, 6.5, 13.5],
            ['20190603-10:01:02', 11, 2.5, 2.22, 9.4]]
    print(data)
    df = pd.DataFrame(data=data, columns=column)

採用iloc,iterrows、itertuple、apply實現上述功能,並對其進行性能比較。

1.1 iloc

顯然,用iloc或者loc逐行遍歷,然後用正則匹配即可達到效果,代碼如下:

def iloc_loop(df):
    # 逐行遍歷df,以'-'爲分隔符將字符串split
    day_lis = []
    time_lis = []
    for i in range(len(df)):
        str_split = df.iloc[i]['Time'].split('-')
        day_lis.append(str_split[0])
        time_lis.append(str_split[1])
    df['day'] = day_lis
    df['hhmmss'] = time_lis
    print(df)

1.2 iterrows

用iterrows逐行訪問
代碼如下:

def use_iterrows(df):
    day_lis = []
    time_lis = []
    # 將iloc定位行改爲iterrows遍歷    for index, row in df.iterrows():
        str_split = row['Time'].split('-')
        day_lis.append(str_split[0])
        time_lis.append(str_split[1])
    df['day'] = day_lis
    df['hhmmss'] = time_lis
    print(df)

1.3 itertuples

也可用itertuples實現
代碼如下:

def use_itertuples(df):                       
    day_lis = []                              
    time_lis = []                             
    # 將iloc定位行改爲iterrows遍歷                    
    for row in df.itertuples():               
        # print('index=', row[1])             
        str_split = row[1].split('-')         
        day_lis.append(str_split[0])          
        time_lis.append(str_split[1])         
    df['day'] = day_lis                       
    df['hhmmss'] = time_lis                   
    return df 

三種處理方式的性能比較如下

在這裏插入圖片描述顯然,iterrows 和itertuples效率更高。

1.4 apply函數

利用apply函數也可實現上述功能

def try_apply(df):
      df['day'] = df['Time'].apply(lambda x: x.split('-')[0])
      df['hhmmss'] = df['Time'].apply(lambda x: x.split('-')[1])
try_apply(df)

執行時間結果如下:
在這裏插入圖片描述
使用apply()函數讓代碼變得更簡潔、易讀,並且耗時大幅減小至0.0009S!這是因爲apply函數對傳入的參數進行了並行化處理,使處理效率大大提升.

for循環-條件表達式 優化

1 for循環優化包含多個判斷表達式的順序

對於 and,應該把滿足條件少的放在前面,對於 or,把滿足條件多的放在前面。
如下:
在這裏插入圖片描述
可見執行條件表達式的順序,對執行程序還是有一定的影響


版權歸於Eshter,轉載請告知
撰寫by: Eshter
時間:20190801

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章