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

如何利用Pandas apply函数的输出创建新DataFrame?

用Pandas实现用户日志时间差序列的整合

方法一:基于自定义函数的分组后合并

首先确保你的makeSeriesPerUser函数返回包含user_id和time_diff的DataFrame(或带命名的Series),示例函数如下:

import pandas as pd

def makeSeriesPerUser(user_logs):
    # 先按时间排序,保证计算的是相邻消息的时间差
    user_logs_sorted = user_logs.sort_values('date_time')
    # 计算相邻时间差,dropna去掉每个用户的第一条无差值记录
    time_diff = user_logs_sorted['date_time'].diff().dropna()
    # 转为DataFrame并关联当前用户ID
    time_diff_df = time_diff.to_frame(name='time_diff')
    time_diff_df['user_id'] = user_logs['user_id'].iloc[0]
    return time_diff_df

执行分组处理后,直接用pd.concat整合所有用户的结果:

# 分组处理并合并为最终DataFrame
time_diff_result = pd.concat(allLogs.groupby('user_id').apply(makeSeriesPerUser))
# 可选:重置索引,移除原数据的层级索引
time_diff_result = time_diff_result.reset_index(drop=True)

方法二:简化自定义函数,利用分组索引自动关联用户ID

如果你的makeSeriesPerUser仅返回时间差的Series:

def makeSeriesPerUser(user_logs):
    user_logs_sorted = user_logs.sort_values('date_time')
    return user_logs_sorted['date_time'].diff().dropna()

分组后会得到一个多层索引的Series(外层是user_id,内层是原数据的索引),直接转为DataFrame并拆分索引:

time_diff_series = allLogs.groupby('user_id').apply(makeSeriesPerUser)
# 转换为DataFrame并调整列名
time_diff_result = time_diff_series.reset_index()
time_diff_result.columns = ['user_id', 'original_log_index', 'time_diff']

方法三:无需自定义函数,直接用Pandas内置分组运算

如果你的需求只是计算相邻消息的时间差,完全可以不用自定义函数,直接通过分组排序+内置diff实现,效率更高:

# 先按用户ID和时间排序,确保顺序正确
allLogs_sorted = allLogs.sort_values(['user_id', 'date_time'])
# 分组计算每个用户的相邻时间差
allLogs_sorted['time_diff'] = allLogs_sorted.groupby('user_id')['date_time'].diff()
# 过滤掉无时间差的记录(每个用户的第一条日志),提取需要的字段
time_diff_result = allLogs_sorted.dropna(subset=['time_diff'])[['user_id', 'time_diff']]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:25:27