如何在Pandas DataFrame中按用户提取time列的跨行差值?
解决方案:按用户提取time列的连续差值
没问题,这事儿用Pandas的组合操作就能完美解决,正好满足你要的针对每个用户,计算当前行与上一次出现行的time差值的需求。
步骤1:先还原你的DataFrame
首先我们把你提供的数据转换成可运行的Pandas DataFrame:
import pandas as pd # 构造你的数据 data = { 'user': ['F', 'T', 'T', 'T', 'B', 'K', 'J', 'T', 'J', 'B'], 'time': [0, 0, 0, 1, 1, 2, 2, 3, 4, 4] } df = pd.DataFrame(data)
步骤2:核心计算逻辑
用groupby按用户分组,再对time列使用diff()方法——这个方法专门用来计算组内当前行与前一行的差值,完全匹配你的需求:
# 新增time_diff列,存储每个用户的连续time差值 df['time_diff'] = df.groupby('user')['time'].diff()
运行结果说明
执行后你会得到这样的结果:
| index | user | time | time_diff |
|---|---|---|---|
| 0 | F | 0 | NaN |
| 1 | T | 0 | NaN |
| 2 | T | 0 | 0.0 |
| 3 | T | 1 | 1.0 |
| 4 | B | 1 | NaN |
| 5 | K | 2 | NaN |
| 6 | J | 2 | NaN |
| 7 | T | 3 | 2.0 |
| 8 | J | 4 | 2.0 |
| 9 | B | 4 | 3.0 |
- 第一次出现的用户(比如F、首次出现的T/J/B/K)因为没有上一次的时间记录,所以
time_diff为NaN,这是合理的; - 你提到的用户J,两次出现的time分别是2和4,差值4-2=2,正好对应结果里的2.0;
- 多次出现的用户(比如T),每次的差值都是当前time减去上一次出现的time,完全符合你“提取当前行与上一次出现行的time差值”的要求。
可选:处理空值
如果想把首次出现的NaN替换成0(或者其他默认值),可以用fillna():
df['time_diff'] = df.groupby('user')['time'].diff().fillna(0)
内容的提问来源于stack exchange,提问作者TJE
相关产品推荐
相关产品推荐

