按A分组筛选行:C日期与B日期间隔超2天且最接近
解决按组筛选日期间隔符合条件的行的问题
我来帮你搞定这个需求,用Pandas就能轻松实现,咱们一步步来:
步骤1:准备数据并转换日期类型
首先得把字符串格式的日期转成Pandas的datetime类型,这样才能计算时间间隔:
import pandas as pd # 构造原始数据 data = { 'A': [0,1,2,3,4,5,6,7], 'B': ['2002-01-16','2002-01-16','2002-01-16','2002-01-16','2002-04-28','2002-04-28','2002-04-28','2002-04-28'], 'C': ['2002-02-28','2002-01-30','2002-02-28','2002-01-30','2002-04-30','2002-05-25','2002-04-30','2002-05-25'] } df = pd.DataFrame(data) # 转换B、C列为datetime类型 df['B'] = pd.to_datetime(df['B']) df['C'] = pd.to_datetime(df['C'])
步骤2:计算日期间隔
接下来计算C和B之间的天数差值,方便后续筛选:
df['Diff'] = (df['C'] - df['B']).dt.days
步骤3:按组筛选符合条件的行
这里提供两种方法,按需选择:
方法一:使用groupby.apply(直观易懂)
这种方法逻辑清晰,适合小数据集:
# 按A分组,每组内先筛选出差值>2的行,再找到其中差值最小的行 result = df.groupby('A').apply( lambda x: x[(x['Diff'] > 2) & (x['Diff'] == x[x['Diff'] > 2]['Diff'].min())] ).reset_index(drop=True) # 去掉临时的Diff列,得到最终结果 final_result = result.drop('Diff', axis=1) print(final_result)
方法二:使用transform(性能更优)
如果你的数据集很大,推荐用这个方法,避免循环,效率更高:
# 计算每组中满足Diff>2的最小差值 df['min_valid_diff'] = df.groupby('A')['Diff'].transform(lambda x: x[x>2].min()) # 筛选符合条件的行:差值>2 且 等于组内最小有效差值 result = df[(df['Diff'] > 2) & (df['Diff'] == df['min_valid_diff'])] # 清理临时列并重置索引 final_result = result.drop(['Diff', 'min_valid_diff'], axis=1).reset_index(drop=True) print(final_result)
最终输出
两种方法都会得到你期望的结果:
A B C 0 1 2002-01-16 2002-01-30 1 3 2002-01-16 2002-01-30 2 5 2002-04-28 2002-05-25 3 7 2002-04-28 2002-05-25
内容的提问来源于stack exchange,提问作者Tie_24
相关产品推荐
相关产品推荐

