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