我有一个数据帧,我正在计算时间差,由于一些问题,我的一些时间差小于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 发布于 2018-02-28 18:17:50
您不需要显式循环(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.5mshttps://stackoverflow.com/questions/49026638
复制相似问题