如何使用固定列迭代pandas数据帧的每一行并根据python中的条件执行操作?

时间:2018-02-28 09:56:59

标签: python pandas dataframe

我有一个数据框,我正在计算时差,由于某些问题,我的一些时间差异小于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 

1 个答案:

答案 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