首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在python中迭代具有固定列的pandas数据框的每一行,并根据条件执行操作?

如何在python中迭代具有固定列的pandas数据框的每一行,并根据条件执行操作?
EN

Stack Overflow用户
提问于 2018-02-28 17:56:59
回答 1查看 99关注 0票数 1

我有一个数据帧,我正在计算时间差,由于一些问题,我的一些时间差小于0(零),现在我想迭代这些数据,并检查条件,如果时间差小于0,那么我想添加一个特定值。

Here就是图像,这是我正在获取的数据,我想要操作列'TIME‘。

尽管我已经尝试过了

代码语言:javascript
运行
复制
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 
EN

回答 1

Stack Overflow用户

发布于 2018-02-28 18:17:50

您不需要显式循环(df.iterrows)或隐式循环(df.apply)。

相反,您可以使用矢量化的pandas功能:

代码语言:javascript
运行
复制
df.loc[df['Time'] >= 43200, 'Time'] -= 43200
df.loc[df['Time'] < 0, 'Time'] += 43200

这将比任何循环都要快得多,而且可能更容易维护。

下面是一些基准测试与基于循环的解决方案的比较。

性能基准测试

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49026638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档