如何计算每个participant的首次与末次测试时间差并生成新列
Pandas 同ID最早/最晚时间差计算方案
你之前使用
diff()没有得到预期结果,是因为diff()的作用是计算组内相邻两行的时间差,而非同一个分组下最大值与最小值的差。
前置步骤
首先需要将时间列转为pandas datetime格式,避免字符串计算报错:
import pandas as pd df['createdOn'] = pd.to_datetime(df['createdOn'])
注:如果你的实际数据中用户ID列名为
healthCode,将下方代码中的participant替换为healthCode即可。
方案1:生成仅含用户ID和对应时间差的新DataFrame
通过groupby.agg先计算每个用户的最早、最晚测试时间,再求差值:
time_diff_df = df.groupby('participant')['createdOn'].agg( first_test='min', last_test='max' ).assign( # 差值默认是timedelta格式,可按需转成秒、小时、天等单位 total_duration=lambda x: x['last_test'] - x['first_test'] # 示例:转成小时单位的话用下面这行 # total_duration=lambda x: (x['last_test'] - x['first_test']).dt.total_seconds() / 3600 ).reset_index()[['participant', 'total_duration']]
方案2:将时间差作为新列添加到原DataFrame
通过transform将组内计算结果广播到组内所有行,实现原表新增列:
df['total_duration'] = df.groupby('participant')['createdOn'].transform( lambda x: x.max() - x.min() )
内容的提问来源于stack exchange,提问作者ga4696
相关产品推荐
相关产品推荐

