You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas内置函数替代遍历唯一用户的循环操作?

问题背景

我有一张记录用户及其操作时间的表格:

user_idtimeuser_action
user_11action_1
user_22action_2
user_13action_3
user_24action_4

我的算法需要遍历唯一用户值,使用shift函数执行相关操作,代码如下:

users = df.user_id.unique()

df_2 = pd.DataFrame(columns = ...) # 空DataFrame

for user in users:
    df_new = df[df.user_id == user]
    df_new['...'] = df['user_action'].shift(1)....
    # 一些使用shift的操作

    df_2 = pd.concat([df_2, df_new])

同时还会用到cumsum,因此必须按用户拆分数据处理。但这种基于Python for循环的方法耗时较长,如何用Pandas内置函数实现该逻辑?


优化方案:用groupby替代手动循环

Pandas的groupby是专为分组场景设计的高效内置工具,完全可以替代手动遍历用户的循环,性能提升显著。核心逻辑是按user_id分组后,直接对每个分组应用shift、cumsum等操作,Pandas会自动完成分组内计算与结果合并,无需手动拼接。

基础场景示例

假设你需要给每个用户添加前一次操作记录,同时计算用户操作的累计次数,代码可简化为:

# 先按用户和时间排序,保证分组内操作顺序正确
df = df.sort_values(['user_id', 'time'])

# 分组执行shift操作,获取每个用户的上一次操作
df['prev_action'] = df.groupby('user_id')['user_action'].shift(1)

# 分组计算累计操作次数(从1开始计数)
df['action_count'] = df.groupby('user_id').cumcount() + 1

# 分组计算时间的累计和
df['time_cumsum'] = df.groupby('user_id')['time'].cumsum()

核心优势

  • 性能碾压循环:groupby是Pandas底层优化的操作,比Python层面的for循环快数倍到数十倍,数据量越大差距越明显。
  • 代码更简洁:无需手动创建空DataFrame、遍历用户和拼接结果,一行代码完成分组内计算。
  • 逻辑更清晰:通过groupby直接表达“按用户分组处理”的意图,可读性远高于循环代码。

复杂场景扩展

如果你的逻辑无法用单一内置函数实现,可通过groupby.apply()封装自定义分组处理逻辑(注意:若能拆分为内置函数优先用内置,apply性能略低):

def process_single_user(group):
    # 在这里编写针对单个用户分组的自定义逻辑
    group['prev_action'] = group['user_action'].shift(1)
    # 示例:标记连续操作间隔
    group['time_gap'] = group['time'] - group['time'].shift(1)
    return group

# 应用自定义函数到每个分组
df_processed = df.groupby('user_id').apply(process_single_user).reset_index(drop=True)

内容的提问来源于stack exchange,提问作者h s

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:55:00