如何在Pandas中筛选B列相同且时间间隔1小时内的行
Pandas筛选满足B列相同且时间间隔1小时内的行
需求
现有以datetime为索引的Pandas DataFrame,需筛选出同时满足以下条件的行:
- B列值完全相同
- 同B值的行之间时间间隔不超过1小时
示例说明
s_1的两行时间间隔1小时45分钟,不符合条件,排除s_2中Ford和GMC对应的两行间隔30分钟,符合要求,保留输出s_2中Kia对应的行与最近的s_2行(GMC)间隔超过1小时,排除- 若存在多组符合时间窗口的行,所有相关行均需输出
解决方案代码
import pandas as pd def main(): df = pd.DataFrame({'dttm_utc': pd.date_range('1/1/2012', periods=10, freq=pd.offsets.Minute(n=15))}) df['A'] = [2365, 6721, 9835, 7651, 2398, 4555, 9881, 9080, 2010, 1999] df['B'] = ['s_1', 's_2', 's_3', 's_2', 's_4', 's_5', 's_6', 's_1', 's_7', 's_2'] df['C'] = ['BMW', 'Ford', 'Toyota', 'GMC', 'Hyundai', 'Chevy', 'BMW', 'Honda', 'Tesla', 'Kia'] df.set_index('dttm_utc', inplace=True) print(f'Initial DF:\n{df}') # 定义分组筛选逻辑:检查组内每行是否与前后行时间间隔≤1小时 def filter_group(group): # 计算当前行与上一行的时间差 prev_diff = group.index.to_series().diff() # 计算当前行与下一行的时间差 next_diff = group.index.to_series().diff().shift(-1) # 标记满足条件的行 mask = (prev_diff <= pd.Timedelta(hours=1)) | (next_diff <= pd.Timedelta(hours=1)) return group[mask] # 先筛选出B列有重复的行,再按B分组处理 dup_df = df[df.duplicated('B', keep=False)] result = dup_df.groupby('B', group_keys=False).apply(filter_group) # 去除可能的重复行 result = result.drop_duplicates() print(f'\nResult DF:\n{result}') if __name__ == "__main__": main()
运行输出
Initial DF: A B C dttm_utc 2012-01-01 00:00:00 2365 s_1 BMW 2012-01-01 00:15:00 6721 s_2 Ford 2012-01-01 00:30:00 9835 s_3 Toyota 2012-01-01 00:45:00 7651 s_2 GMC 2012-01-01 01:00:00 2398 s_4 Hyundai 2012-01-01 01:15:00 4555 s_5 Chevy 2012-01-01 01:30:00 9881 s_6 BMW 2012-01-01 01:45:00 9080 s_1 Honda 2012-01-01 02:00:00 2010 s_7 Tesla 2012-01-01 02:15:00 1999 s_2 Kia Result DF: A B C dttm_utc 2012-01-01 00:15:00 6721 s_2 Ford 2012-01-01 00:45:00 7651 s_2 GMC
内容的提问来源于stack exchange,提问作者user1717931
相关产品推荐
相关产品推荐

