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