我有一个数据框,我正在计算时差,由于某些问题,我的一些时间差异小于0(零),现在我想迭代这些数据并检查条件,如果时差是小于0然后我想添加一个特定的值。
Here是图像,这是我得到的数据,我想操纵“TIME”列。
虽然我试过这个
for row in df_all.rows:
if df_all.iloc[row]['Time'].values >=43200:
df_all.iloc[row]['Time']=df_all.iloc[row]['Time'].values-43200
elif df_all.iloc[row]['Time'].values <0:
df_all.iloc[row]['Time']=df_all.iloc[row]['Time'].values+43200
else:
pass
答案 0 :(得分:2)
您不需要显式循环(df.iterrows
)或隐式循环(df.apply
)。
相反,您可以使用矢量化pandas
功能:
df.loc[df['Time'] >= 43200, 'Time'] -= 43200
df.loc[df['Time'] < 0, 'Time'] += 43200
与任何循环相比,这将显着更快,并且可能更容易维护。
下面是一些基准测试与基于循环的解决方案。
效果基准
import numpy as np, pandas as pd
df_all = pd.DataFrame({'Time':np.random.uniform(-500,50000, size=(10000,))})
def jp(df):
df.loc[df['Time'] >= 43200, 'Time'] -= 43200
df.loc[df['Time'] < 0, 'Time'] += 43200
return df
def dl(df):
def _time(x):
_out = x
if _out >= 43200:
_out -= 43200
if _out <0:
_out += 43200
return _out
df['Time'] = list(map(_time,df['Time'].values))
return df
%timeit jp(df_all) # 3.5ms
%timeit dl(df_all) # 8.5ms