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

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