如何按条件拆分pandas DataFrame为含3个不同升序time_Utc的子表
实现方法
你之前的写法是全局随机抽取3行,没有对time_Utc的唯一性做约束,自然会抽到同日期的行。可以按「先处理日期格式→提取排序后的唯一日期→按每3个日期为一组筛选原表」的逻辑实现,步骤如下:
- 首先将
time_Utc字段转为标准日期类型,避免字符串排序出错 - 提取所有去重后的日期值,按时间从小到大排序
- 以3个日期为步长切分排序后的日期列表,每一组日期对应筛选原表的行,即为符合要求的子DataFrame
完整顺序拆分代码
import pandas as pd # 构造原始DataFrame df = {'Source': ['-23456','-23456','3456','','56789','-12456','-13245','','45678','12346','','-23456','-23456','-234556','124566','098745','-67890'], 'number_mp': [369452]*17, 'time_Utc': ["2014-9-12","2014-9-12","2014-9-12" ,"2017-5-14","2017-5-14","2017-5-14","2016-10-26" ,"2016-10-26" ,"2016-10-26" ,"2016-11-3" ,"2016-11-3" ,"2016-8-10" ,"2016-8-10","2016-8-10","2014-9-12","2014-9-12","2014-9-12"]} df = pd.DataFrame(df) # 转换日期格式 df['time_Utc'] = pd.to_datetime(df['time_Utc']) # 获取从小到大排序的唯一日期列表 unique_sorted_dates = sorted(df['time_Utc'].unique()) res = [] # 按步长3切分日期组 for i in range(0, len(unique_sorted_dates), 3): date_group = unique_sorted_dates[i:i+3] # 如果要求每组必须凑够3个不同日期,保留下面两行;要保留不足3个的尾组就删掉这两行 if len(date_group) < 3: break # 筛选对应日期的行生成子表 sub_df = df[df['time_Utc'].isin(date_group)].reset_index(drop=True) res.append(sub_df)
随机组合3个日期的版本
如果你需要的是随机生成多组「包含3个不同日期」的子表,而不是按固定顺序切分,可以用下面的写法,避免重复抽到同一组日期:
import random res = [] used_group = set() # 括号里填你需要生成的子表总数,注意不要超过所有日期能组成的不重复3元组总数 for _ in range(3): while True: # 随机抽3个不重复日期并排序 current_group = tuple(sorted(random.sample(list(unique_sorted_dates), 3))) if current_group not in used_group: used_group.add(current_group) break sub_df = df[df['time_Utc'].isin(current_group)].reset_index(drop=True) res.append(sub_df)
结果说明
你提供的样例数据里去重后共5个日期,从小到大依次是2014-09-12、2016-08-10、2016-10-26、2016-11-03、2017-05-14。按顺序切分的话,第一组包含前3个日期的所有行,剩余2个日期不足3个,开启凑够3个的判断时只会返回1个子表。
内容的提问来源于stack exchange,提问作者Johana Murcia
相关产品推荐
相关产品推荐

