如何在特定时间范围内修改DataFrame行值?处理用户商店退货标记
处理采购记录DataFrame的退货标记逻辑
需求明确:针对每个用户和商店,若两次退货(returned为yes)的时间间隔≤5分钟,需将后一次的yes标记设为NaN,生成新列returnedv2。
实现步骤与代码
假设你的DataFrame名为df,列名分别为time、user、item、store、returned,可以按以下步骤处理:
import pandas as pd # 1. 将时间列转换为datetime格式,方便计算时间差 df['time'] = pd.to_datetime(df['time'], format='%H:%M') # 2. 复制原退货列到新列,保留原始数据 df['returnedv2'] = df['returned'] # 3. 按用户+商店分组,仅处理有退货标记的记录 grouped = df[df['returned'] == 'yes'].groupby(['user', 'store']) for (user, store), group in grouped: # 计算相邻退货记录的时间间隔(单位:分钟) group['time_diff'] = group['time'].diff().dt.total_seconds() / 60 # 筛选出间隔≤5分钟的退货记录索引 invalid_rows = group[group['time_diff'] <= 5].index # 将这些行的新退货列设为缺失值 df.loc[invalid_rows, 'returnedv2'] = pd.NA
代码说明
- 转换时间格式是核心前提,字符串无法直接计算时间间隔;
- 先复制原列再修改,避免破坏原始数据;
- 仅针对有
yes标记的记录分组计算,减少不必要的运算; - 通过
diff()计算相邻行的时间差,筛选出符合条件的行后批量修改标记。
数据示例
原始数据
time user item store returned 10:00 amy apple store NaN 10:01 amy pear London yes 10:03 amy headphones NaN NaN 10:04 amy missing NaN NaN 10:05 amy blueberry London yes 10:06 amy unknown NaN NaN 10:07 amy table NaN NaN 10:08 amy banana London yes 10:09 amy unknown NaN NaN 10:10 amy banana NaN NaN
处理后输出
time user item store returnedv2 10:00 amy apple store NaN 10:01 amy pear London yes 10:03 amy headphones NaN NaN 10:04 amy missing NaN NaN 10:05 amy blueberry London NaN 10:06 amy unknown NaN NaN 10:07 amy table NaN NaN 10:08 amy banana London NaN 10:09 amy unknown NaN NaN 10:10 amy banana NaN NaN
内容的提问来源于stack exchange,提问作者asd
相关产品推荐
相关产品推荐

